155 lines
6.3 KiB
Markdown
155 lines
6.3 KiB
Markdown
# nova-shell
|
||
|
||
A minimal [Quickshell](https://quickshell.outfoxxed.me) bar for [niri](https://github.com/YarikTH/ycmd), 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.
|
||
|
||
```nix
|
||
# flake.nix
|
||
inputs = {
|
||
nova-shell.url = "git+https://git.berlin.ccc.de/vinzenz/nova-shell";
|
||
nova-shell.inputs.nixpkgs.follows = "nixpkgs";
|
||
};
|
||
```
|
||
|
||
```nix
|
||
# home.nix
|
||
imports = [ inputs.nova-shell.homeModules.default ];
|
||
```
|
||
|
||
## Configuration
|
||
|
||
### Turning it on
|
||
|
||
```nix
|
||
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](https://github.com/danth/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.
|
||
|
||
```nix
|
||
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.
|
||
|
||
```nix
|
||
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.base00`–`base0F` | 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:
|
||
|
||
```nix
|
||
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](https://github.com/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.
|