184 lines
7.5 KiB
Markdown
184 lines
7.5 KiB
Markdown
# nova-shell
|
||
|
||
A [Quickshell](https://quickshell.outfoxxed.me)-based desktop shell for
|
||
[niri](https://github.com/YarikTH/ycmd), lovingly hallucinated by a statistical
|
||
text blender. Status bar, notification center, media controls, system overlays —
|
||
the full package, assembled by a glorified autocomplete engine that has never
|
||
once used a desktop environment in its life.
|
||
|
||
**Use at your own risk.** The slop machine was very confident about every
|
||
architectural decision, which is exactly when you should be most suspicious.
|
||
|
||
## "Features"
|
||
|
||
You didn't ask for most of these. Neither did anyone else.
|
||
|
||
- Status bar with too many widgets, grouped into glowing color-coded sections
|
||
- Notification center that replaces swaync (whether you wanted that or not)
|
||
- Hover panels for volume, brightness, and media — the robot merged the OSD, tooltip, and mixer into one thing because it couldn't be stopped
|
||
- Network/bluetooth/tray context menus, power menu, idle inhibitor
|
||
- Privacy indicators for when your webcam is silently recording you
|
||
- GPU-rendered hexagonal backdrop for niri overview, complete with wave animations and rainbow shimmer, because the robot thinks your desktop should look like a cyberpunk hacker terminal
|
||
- Neon clock on the background layer with a color-cycling colon. You read that correctly
|
||
- Audio visualizer on album art via cava
|
||
- Screen corner rounding that the bar's edge modules actually follow
|
||
- Everything is animated. Everything. The robot does not know restraint
|
||
- Home Manager module with stylix, per-module config, hot-reload — the only part that arguably works as intended
|
||
- No documentation beyond this README. Good luck
|
||
|
||
## 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
|
||
temperature.warm = 55; # °C threshold for warm color
|
||
temperature.hot = 75; # °C threshold for hot color
|
||
battery.warning = 30; # % for warning notification
|
||
battery.critical = 10; # % for critical blink + notification
|
||
cpu.interval = 2000; # polling interval in ms
|
||
notifications.timeout = 3000; # popup auto-dismiss in ms
|
||
notifications.maxPopups = 4; # max simultaneous popups (0 to disable)
|
||
notifications.maxVisible = 10; # scrollable history limit in center
|
||
};
|
||
```
|
||
|
||
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`, `backgroundOverlay`, `overviewBackdrop`.
|
||
|
||
### 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";
|
||
};
|
||
```
|
||
|
||
### Niri overview backdrop
|
||
|
||
If you use the Home Manager module like a civilized person, the required niri
|
||
layer rule is added automatically. If you insist on managing your niri config
|
||
by hand — because declarative configuration is apparently too convenient — add
|
||
this to your `config.kdl`:
|
||
|
||
```kdl
|
||
layer-rule {
|
||
match namespace="^nova-overview-backdrop$"
|
||
place-within-backdrop true
|
||
}
|
||
```
|
||
|
||
Without this, the overview backdrop widgets won't be visible between workspace
|
||
rows. The bar will still work, you'll just miss out on the pretty parts, which
|
||
is arguably what you deserve for not using Nix properly.
|
||
|
||
## 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.
|