TacidOS
Developers
Documentation

Decision 0019

Niri compositor; `tacid-shell` in Iced on layer-shell

Architecture decision record 0019: Niri compositor; `tacid-shell` in Iced on layer-shell

Status
Accepted
Date
2026-09-03

Context

The graphical face must be quiet, minimal, keyboard-first, Wayland-native, controllable by the agent, and written in the project’s one language.

The three plans

  • Grok: TUI is the desktop; an optional cage + single app later.
  • Fable: Hyprland (“what the audience expects post-Omarchy”), waybar, ghostty, a GTK4/libadwaita panel with Relm4; Niri “worth watching”.
  • Codex: Hyprland with an explicit NVIDIA workstream; Quickshell/QML for the shell; no gamer styling, no giant chat windows.

Decision

Niri: Rust on Smithay, scrollable tiling, clean JSON IPC, disciplined maintenance, built-in xwayland-satellite integration since 25.08. tacid-shell in Iced with iced_layershell: bar with badges, the Super+Space command surface (launch, search, ask in one box), the agent panel with unforgeable approvals, notifications, curated settings. Ghostty (OSC 133 structured sessions), Firefox, PipeWire, Neovim and Helix available. AccessKit accessibility is a requirement. The graphics matrix includes NVIDIA explicit sync.

Consequences

  • One language across the stack; the shell shares the protocol crate.
  • Layer-shell plumbing is ours to own; libcosmic’s patterns are a reference, not a dependency, to keep Tacid’s identity.
  • Hyprland users will ask; the answer is in this record — and it changed once the face was built and turned out to be portable. ADR-0053 makes the compositor tacid.desktop.compositor, with Niri still the default and Hyprland supported; it also records what building the graphical test found, which is that Smithay has no software renderer and a machine with no working GPU driver gets no output under Niri.

Alternatives rejected

  • Hyprland: larger ecosystem and audience expectation, but C++, churn, and a default aesthetic the design system would spend itself fighting. Narrowed by ADR-0053: the churn is still the reason Niri is the default, but rejecting it outright treated the compositor as part of Tacid’s identity, and it is not — the shell is.
  • Quickshell/QML: fastest path to a beautiful shell; a second language and runtime in the core.
  • libcosmic: solves layer-shell, applets and settings today, at the cost of COSMIC’s design language; revisit if iced_layershell stalls.
  • A compositor of our own on Smithay: the right long-term option only if Niri ever stops.