NIHIL

ex nihilo

A monochrome, dot‑matrix desktop for NixOS

Caelestia's frame and drawers, dressed in the language of Nothing: greys for hierarchy, dots for display, red only to interrupt. All of it declared in Nix, from the boot splash to the lock screen.

The NIHIL desktop: a black frame around a dot-matrix wallpaper of a night sky over mountains, the bar on the left with workspace LEDs, and clock, network and music widgets.

One shape around the screen

The frame is a single black shape. Its left side widens into the bar, and the drawers grow out of it with concave joints, so they read as part of the hardware rather than windows on top.

The dashboard drawer open at the top: dot-matrix clock, a track with its cover and a spectrum in LED columns, CPU, RAM and temperature dials, and a network scope.

Dashboard

Time, music with its cover and spectrum drawn in dots, system dials and a network oscilloscope.

SUPERDor hover the top edge
The settings panel on the right: round toggles for Wi-Fi, Bluetooth, output, mic, silent and night, segmented sliders, the list of Wi-Fi networks and the notification history.

Settings

Wi‑Fi with passwords, Bluetooth, audio output, segmented sliders and the notification history.

SUPERPor rest the pointer in the top-right corner
The launcher drawer at the bottom: a search field and a grid of grey app icons, the selected one in colour.

Launcher

Apps stay grey until you select them. Type > for actions, = to calculate and ? to ask Nilo.

SUPERSPACEor three fingers up, or the bottom edge
A critical battery notification at the top right, and a red segment of light running along the bottom edge of the frame.

Light on the edge

Every notification sends a segment of light around the frame, and critical ones run twice, in red. Plug in the charger and two lights climb both sides from the bottom until they meet at the top.

Nilo, an assistant that lives here

Two white eyes in the launcher, and a model that runs on this computer: Qwen 3.5 on Ollama, with no account and no cloud. They sleep while the model is unloaded, wake up as you type, look up while it thinks and from side to side while it searches.

It answers, searches the web if you let it and looks at this computer. In one repository of yours it can also change files and commit and push, once you have authorized it, and every change waits for your confirmation. After a few minutes without questions it falls asleep and the model leaves memory.

SUPERIthe Copilot key, or ? in the launcher
Nilo's first page: two eyes curved in a smile and the words Hi. I'm Nilo., in dots.

It introduces itself

The first time, it says hello, shows how to call it, offers the models that fit your memory and asks what it may do.

A change to README.md waiting for confirmation: the removed line struck through, the two new lines in white, and cancel and confirm buttons.

Every change, as a diff first

A file waits for enter twice or a click before it is written, like a commit. Escape leaves it as it was.

Nilo's access switches. The one for files is outlined in red and explains what it allows, above cancel and a red authorize button.

Nothing without your say

Files and git stay off until you authorize them, for one repository. Choosing another turns them off again.

# hosts/<name>/default.nix: off by default
nihil.nilo =
{
    enable = true;
    acceleration = "vulkan";   # or "cpu", "rocm", "cuda"
};

Three rules

One file, theme/nihil.nix, holds the tokens. GTK, the terminal, the editor, the compositor, the lock screen, the greeter, the boot splash and the shell are all generated from it.

Hierarchy is made with greys

Red never decorates. It only interrupts: a failed login, a critical notification, the recording LED, a destructive action.

Dots are for display

Doto draws the clock and the big numbers. Text is set in Space Grotesk and metadata in Space Mono.

The frame is hardware

Opaque and flat, with no shadows. Windows sit concentric with it: their rounding is the frame's minus the gap.

  • void#000000frame, bar, drawers
  • surface#0E0E0Ecards
  • raised#1A1A1Ahover, tracks
  • line#2A2A2A1 px lines
  • off#333333unlit LEDs
  • muted#7A7A7Ametadata
  • dim#A3A3A3secondary text
  • ink#F2F2F2text, lit LEDs
  • signal#D71921interrupts only

From nothing, at boot

The NixOS snowflake as an LED matrix: it switches on from the centre, then a band of light sweeps it until the login screen. theme/plymouth.py renders every frame when the system is built.

The wallpapers work the same way. Every image in wallpapers/ is rendered as dots once per screen, at its native size, so each LED lands on exact pixels.

Boot splash: the NixOS snowflake drawn with LEDs switches on from the centre, then a band of light sweeps across it.

Spanish or English

One option sets every string of the shell, the lock screen and the greeter, and the language of their dates.

Launcher actions in English: Lock, Suspend, Restart, Power off, Log out, Next wallpaper.
# hosts/<name>/default.nix
nihil.language = "en";

Install

This is a personal configuration for one ThinkPad, written as a flake. Read hosts/ and modules/ before you switch a machine you care about; the README covers every step in detail.

  1. Clone the repository

    git clone https://github.com/poligle/Nihil-Shell ~/nixos-config
  2. Describe your screens

    Copy hosts/thinkpad to a new host with your hardware configuration, then list its outputs. Sizes are logical, after rotation.

    nihil =
    {
        primaryOutput = "eDP-1";
        wallpaper = "night";
        language = "en";
        outputs =
        {
            "eDP-1" = { width = 1920; height = 1200; };
            "DP-1"  = { width = 1080; height = 1920; bar = false; };
        };
    };
  3. Build and switch

    The first build renders every wallpaper and the boot splash.

    sudo nixos-rebuild switch --flake ~/nixos-config#<name>

Options

All of them live under nihil.* in modules/nihil.nix.

OptionDefaultWhat it does
language"es"Language of the shell, lock screen, greeter and script messages: "es" or "en".
outputsnoneScreens of the host: logical size, whether the frame widens into the bar, dot pitch.
primaryOutputnoneScreen for the desktop widgets and the lock and login backgrounds.
wallpaper"night"Default wallpaper: a file name in wallpapers/.
soundPack"nihil"The synthesised NIHIL sounds, or "classic" for the earlier ones.
trayHidden[ "nm-applet" "blueman" ]Tray items to hide, by part of their id or title. The bar already shows Wi‑Fi and Bluetooth.
nilo.enablefalseNilo, the assistant, with Ollama running its model on 127.0.0.1.
nilo.acceleration"cpu"What runs the model: "cpu", or the GPU through "vulkan", "rocm" or "cuda".
nilo.contextLength16384Tokens of conversation Nilo keeps in view: more remembers more and takes more memory.

Screenshots on this page are the shell rendered in a test harness with sample data: the networks, the track and the notifications are made up, and Nilo is its real agent answering a scripted model.