A minimal Quickshell bar for niri, lovingly hallucinated by a statistical text blender.
Find a file
2026-04-12 18:29:30 +02:00
modules mpris album art: async loading, no cache 2026-04-12 18:29:30 +02:00
nix configurable polling intervals and thresholds per module 2026-04-12 17:44:52 +02:00
flake.lock initial commit 2026-04-10 10:49:48 +02:00
flake.nix remove ws, fmt 2026-04-11 00:22:09 +02:00
README.md restructure module config to objects with enable + extra options 2026-04-12 17:36:38 +02:00
shell.qml osd for volume and brightness 2026-04-12 15:24:08 +02:00

nova-shell

A minimal Quickshell bar for niri, lovingly hallucinated by a statistical text blender. Every line of code in this repository was produced by a glorified autocomplete engine and has not been meaningfully reviewed by a human with a functioning brain.

Use at your own risk. The slop machine was very confident, which is exactly when you should be most suspicious.

"Features"

  • Bar with workspaces, window title, clock, tray, and a regrettable number of widgets
  • Niri IPC integration — workspace indicator, focused window title, power menu with niri msg action quit
  • Context menus for tray icons with submenu support, because the robot watched celestia-shell do it and got jealous
  • Per-module accent colors that change based on state (battery goes red when it's dying, bluetooth goes blue when connected, volume dims when muted — genuinely useful, by accident)
  • OSD overlay for volume and brightness changes — works with niri hotkeys, not just the bar
  • Screen corner rounding — tiny overlay windows that draw quarter-circle masks, configurable via screenRadius (set to 0 if you prefer your corners sharp and your desktop ugly)
  • Weather via wttrbar with configurable arguments and rich HTML tooltips
  • Power menu with lock, suspend, logout, reboot, shutdown
  • Flyout tooltips that actually filter by screen on multi-monitor setups, which only took three attempts to get right
  • Home Manager module with stylix integration, per-module enable/disable, and a theme system that hot-reloads
  • treefmt + nixfmt for formatting, because even AI slop deserves consistent indentation
  • Checks via nix flake check (the irony of testing AI garbage is not lost on anyone)

Installation

Add the flake input and import the Home Manager module. The robot did not test any of this on real hardware, but it was extremely confident while writing it, which is the next best thing.

# flake.nix
inputs = {
  nova-shell.url = "git+https://git.berlin.ccc.de/vinzenz/nova-shell";
  nova-shell.inputs.nixpkgs.follows = "nixpkgs";
};
# home.nix
imports = [ inputs.nova-shell.homeModules.default ];

Configuration

Turning it on

programs.nova-shell.enable = true;

This installs the bar, the Symbols Nerd Font, and a systemd user service that starts with graphical-session.target. If you use stylix, colors and fonts are populated automatically — one fewer thing for the AI to have gotten wrong. If you do not use stylix, you get Catppuccin Mocha, because the robot has taste and it is purple.

Disabling modules

All modules are enabled by default, because the robot was optimistic about what hardware you own and what software you run. Set any to false to make them go away permanently, which will feel better than you expect.

Disabling weather also removes wttrbar from your packages, which is the one piece of genuine dependency management in this entire project and frankly more than it deserves.

programs.nova-shell.modules = {
  weather.enable     = false;  # also evicts wttrbar from your system
  bluetooth.enable   = false;  # for people whose computers have ethernet ports and opinions
  backlight.enable   = false;  # your desktop monitor does not have a backlight slider, probably
  battery.enable     = false;  # see above, but for power
  temperature.enable = false;  # what you don't measure can't alarm you
  disk.enable        = false;  # the number will only make you anxious
  power.enable       = false;  # if you enjoy living dangerously without a logout button

  # modules with extra config
  backlight.step = 2;                                  # brightness adjustment %
  weather.args   = [ "--nerd" "--location" "Berlin" ]; # wttrbar arguments
};

Each module is an object with enable (default true) and optional extra settings. Full list: workspaces, tray, windowTitle, clock, notifications, mpris, volume, bluetooth, backlight, network, powerProfile, idleInhibitor, weather, temperature, cpu, memory, disk, battery, power.

Theme

Theme keys are merged on top of whatever stylix provides. You only need to specify what you want to override. Values are written to ~/.config/nova-shell/theme.json, which the bar watches for changes at runtime, so you can iterate on colors without restarting anything — a level of polish that frankly raises uncomfortable questions about the rest of it.

programs.nova-shell.theme = {
  barHeight  = 28;
  barOpacity = 0.85;
  barPadding = 10;
  barSpacing = 8;
  radius     = 6;
  fontSize   = 13;
  fontFamily = "JetBrains Mono";

  # override individual palette entries if stylix's choices personally offend you
  colors.base00 = "#1a1a2e";
  colors.base05 = "#e0e0f0";
};

Full list of theme keys and their defaults:

Key Default Controls
colors.base00base0F Catppuccin Mocha Base16 palette
fontFamily "sans-serif" Bar text font
iconFontFamily "Symbols Nerd Font" Nerd font for icons
fontSize 12 Base font size (px)
barHeight 32 Bar height (px)
barOpacity 0.9 Bar and flyout background opacity
barPadding 8 Left/right bar content margin (px)
barSpacing 12 Gap between modules (px)
moduleSpacing 4 Icon-to-label gap within a module (px)
radius 4 Corner radius for flyouts and menus (px)
screenRadius 15 Screen corner rounding, 0 to disable (px)

Systemd service

Enabled by default, bound to graphical-session.target. To attach it to something more specific, or to disable it entirely because you have strong feelings about how your session starts:

programs.nova-shell.systemd = {
  enable = true;
  target = "niri.service";
};

Contributing

Sure, why not. It can't get much worse, and the GPL requires you to share your improvements anyway, so you might as well.

License

GPLv3. Yes, the AI slop is copylefted now. caelestia-dots/shell provided architectural inspiration, which the robot then faithfully mangled into this. If you improve it, the license requires you to share those improvements — a higher standard of accountability than the author has held themselves to.