Most published Quickshell shells are dotfiles: copied into one user's config, tied to that setup, adapted by hand. CRT Shell isn't. It ships as an installable Nix flake with a documented host contract, and the shell deliberately owns less. CRT Shell is public now.
The shell treats the wallpaper as the primary canvas and keeps controls on the edges: a compact left rail, framed overlay surfaces, bottom choice rails, a right-side system overview. What makes it installable isn't the chrome, it's the seams.
The contract
A shared compositor interface ships Hyprland and Sway adapters behind it.
Provider commands emit normalized JSON for QML; runtime snapshot streams emit
repeated normalized JSON over a user-owned Unix domain socket. The UI never
parses a raw source format — no wttr.in response strings, no shell output, no
config files. The rules are written down in tools/CONTRACT.md and enforced by
contract tests run under nix flake check.
The result of every seam is a division of ownership. The shell owns the UI and the data contract; the consumer owns compositor keybindings, service supervision, host actions, secrets, and machine-specific policy. A working setup needs the Home Manager integration, not just this repo. That's deliberate — the preview targets Nix users on Hyprland or Sway, not a universal shell distribution.
The dog paw
The consumer-owned bar widget seam was dogfooded by the dog widget, and the dog's paw sat off-center for a while. The cause stacked, which is why it took three passes.
First the pill left-aligned the widget, fixed by AlignHCenter. Then the
glyph's optical weight was off, and the icon reads offsetX/offsetY from the
status — that was a real fix, but the offsets were a patch over something
deeper. The actual root cause was a Loader-hosted widget container that had an
implicitHeight but no implicitWidth. The Loader collapsed the widget to zero
width and pinned its centered icon to the pill's left edge. The offsets got
rolled back and the container got an explicit width instead.
The second quirk is the overlay one. An overlay Repeater as a direct child of
ShellRoot never instantiates its delegates — Quickshell doesn't create a host
in that position, so the toggle only flipped state with nothing to show. The fix
is to wrap the Repeater in an Item.
Neither is something a consumer can reasonably guess, and both are the things that turn "installable" from a claim into a fact. They're documented in the seams and covered by the contract tests.
CRT Shell is an early preview, and the interface and package contract may still move. But the seams — and the fact the shell owns less — are the point.