Desktop Shell for Niri
  • Rust 91.5%
  • Nix 4.5%
  • CSS 4%
Find a file
2026-09-24 18:20:48 -04:00
.impeccable feat(impecable): add impecable skill context 2026-06-17 19:39:44 -04:00
crates FIXME!!!: dash animation is not ideal in this commit, this commit is about getting the dash to animate as one island, but its not the best rn 2026-09-24 18:20:48 -04:00
nix feat(launcher): decouple application lifetimes into systemd app scopes 2026-09-24 18:19:47 -04:00
static feat(theme): add pana-theme crate for matugen-driven palettes 2026-08-23 18:22:25 -04:00
.gitignore feat: add system tray and sandbox VM 2026-06-07 23:53:38 -04:00
ARCHITECTURE.md feat(launcher): decouple application lifetimes into systemd app scopes 2026-09-24 18:19:47 -04:00
Cargo.lock feat(theme): add pana-theme crate for matugen-driven palettes 2026-08-23 18:22:25 -04:00
Cargo.toml feat(theme): add pana-theme crate for matugen-driven palettes 2026-08-23 18:22:25 -04:00
DESIGN.md refactor(pana): unify popup and subscription lifecycles 2026-08-26 20:38:43 -04:00
DESIGN_VOCAB.md FIXME!!!: dash animation is not ideal in this commit, this commit is about getting the dash to animate as one island, but its not the best rn 2026-09-24 18:20:48 -04:00
flake.lock feat(pana-saver): add native libghostty idle screensaver - add new pana-saver binary with per-monitor ghostty-vt windows - add screensaver config with effect selection and optional command override - wire idle timeout launch path and nix packaging/docs 2026-08-21 18:57:09 -04:00
flake.nix feat(pana-saver): add native libghostty idle screensaver - add new pana-saver binary with per-monitor ghostty-vt windows - add screensaver config with effect selection and optional command override - wire idle timeout launch path and nix packaging/docs 2026-08-21 18:57:09 -04:00
PRODUCT.md feat(impecable): add impecable skill context 2026-06-17 19:39:44 -04:00
README.md feat(theme): add pana-theme crate for matugen-driven palettes 2026-08-23 18:22:25 -04:00
THIRD_PARTY_NOTICES.md feat(theme): add pana-theme crate for matugen-driven palettes 2026-08-23 18:22:25 -04:00

Pana

DE-like shell for niri, built with gtk4-rs and layer-shell.

See ARCHITECTURE.md for the component map and roadmap.

Build

nix build           # package
nix develop         # dev shell
cargo run           # inside the dev shell, needs a Wayland session

Run

nix run

Screensaver

Pana starts a libghostty-backed terminal saver after five idle minutes. Tarts is included in the Nix package; no global install is required. Select any bundled Tarts effect directly:

# ~/.config/pana/config.toml
[screensaver]
enabled = true
timeout-seconds = 300
effect = "fire"
oled = false

Available effects: matrix, life, maze, boids, cube, crab, donut, pipes, plasma, fire, constellation, blank, and random. Random selects a visible effect each time the session becomes idle.

Set oled = true to force every terminal background to pitch black while retaining themed foreground colors. To run something other than Tarts, set an executable-plus-arguments override:

[screensaver]
command = ["fish", "-c", "asciiquarium"]

Activity dismisses the saver. This is visual only; it does not lock the session.

The saver quantizes Tarts output into Pana's generated ANSI16 palette. It uses Pana's built-in palette when no generated theme exists; Ghostty configuration is never consulted.

Theming

Pana owns the transformation from Material 3 into its complete artifact set:

~/.config/pana/theme/material.json
~/.config/pana/theme/theme.css
~/.config/pana/theme/ansi16.json
~/.config/pana/theme/base16.yaml

theme.css is hot-reloaded by the shell, ansi16.json drives the saver, and base16.yaml is the semantic scheme for external consumers. With runtime generation enabled, wallpaper changes invoke Matugen through Pana's private template and replace all artifacts together:

[wallpaper]
path = "/home/me/Pictures/wallpaper.png"

[theme]
generate = true
polarity = "dark"
scheme = "rainbow"

The same compiler is available for build-time use:

pana-theme compile material.json output-directory dark
pana-theme generate wallpaper.png output-directory dark scheme-rainbow

Inspiration