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 and the caffeine switch, a track with its cover and a spectrum in LED columns, CPU, RAM and temperature dials, a network scope, and a kanban with tasks to do, doing and done.

Dashboard

Time, music with its cover and spectrum drawn in dots, system dials, a network oscilloscope, a small kanban and caffeine to keep the screen awake.

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, like the battery warnings at 15, 10 and 5 %. 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, looks at this computer and opens apps: abre spotify opens it at once. Once you authorize it, it changes files, commits and pushes in one repository of yours and runs commands, and each of those waits for your confirmation. Close the launcher while it answers and it tells you when it's done, in a panel that comes out of the bar next to its eyes. Simple questions can go to a smaller, faster model, and 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, git and the terminal stay off until you authorize them. Commands that delete or change the system come in a red card, and anything with sudo opens in a terminal for your password.

# /etc/nixos/local.nix, or "nilo" in settings.json: 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. Try it with a picture of yours in the studio.

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.
/etc/nixos/settings.json
"language": "en"

Install

Two ways in, to the same system: the installer, on any computer, or the NixOS you already have, from a clone of this repository. Each machine keeps what is its own in /etc/nixos: who uses it, its language, keyboard and screens. NIHIL comes from here, and updates never touch what is yours.

With the installer

  1. Download the installer

    The ISO is in Releases: latest, built from every push, or a tagged version. Check it against SHA256SUMS, write it to a USB stick and boot it (UEFI).

    sha256sum -c SHA256SUMS --ignore-missing
    sudo dd if=nihil-*.iso of=/dev/sdX bs=4M status=progress oflag=sync
  2. Answer a few questions

    Language, network, keyboard, time zone, your name and password, and where it goes: a whole disk, or next to Windows or another system, in room it makes by shrinking it safely, and the rest stays as it is. It finds your screens and GPU on its own.

  3. Make it yours

    The first login opens the welcome: what NIHIL is and how its frame works, then your name, language, keyboard, wallpaper and system. Later, Preferences (SUPER + comma, or the cog in quick settings) changes all of it, shortcuts and gestures too, and applies it by rebuilding the system in the background.

On a NixOS you already have

The classic way: clone NIHIL and rebuild from it. Any NixOS on UEFI will do; the switch brings it to the release NIHIL pins, booting with systemd-boot.

  1. Clone NIHIL

    Your own copy, to read, change and pull.

    git clone https://github.com/poligle/Nihil-Shell ~/Nihil-Shell
  2. Give the machine its flake

    The template goes to /etc/nixos, next to the hardware-configuration.nix it already has. In settings.json: the user you have, the computer's name, language, keyboard, time zone and screens; in local.nix, the system.stateVersion of your old configuration.nix.

    sudo cp -a /etc/nixos /etc/nixos.before-nihil
    sudo cp ~/Nihil-Shell/templates/machine/{flake.nix,settings.json,local.nix,home.nix} /etc/nixos/
    sudoedit /etc/nixos/settings.json /etc/nixos/local.nix
  3. Build it from the clone

    Point the flake at your copy and switch; HOST is the computer's name. Leave the sed out to follow GitHub instead.

    sudo sed -i "s|github:poligle/Nihil-Shell|path:$HOME/Nihil-Shell|" /etc/nixos/flake.nix
    sudo NIX_CONFIG="experimental-features = nix-command flakes" \
      nixos-rebuild switch --flake /etc/nixos#HOST

Keep it up to date

One command brings the latest NIHIL and rebuilds (with a clone, git pull it first); another applies your own changes. nihil dev tries a checkout's changes before pushing them.

nihil update
nihil rebuild
nihil dev ~/Nihil-Shell    # until nihil dev off

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.
nilo.loadedModels1Models Ollama keeps in memory at once. With 2, the automatic choice of model switches without loading again.
nilo.coauthornilo-nihilWho Nilo signs its commits as, so GitHub shows its face next to yours. null for none.

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.