1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# niri-workspaces-rs
A fast, event-driven workspace indicator for [Waybar](https://github.com/Alexays/Waybar) and [niri](https://github.com/YaLTeR/niri).
<img width="2880" height="1800" alt="image" src="https://github.com/user-attachments/assets/5b1debef-c18d-4ae9-9a82-5655dd4fc913" />
https://github.com/user-attachments/assets/7fb1fea8-ff79-489a-80f3-63fb1a20cf32
## Features
- **Visual bars instead of numbers** — each window is rendered as a colored bar.
- **Event-driven daemon mode** — keeps a persistent niri socket connection and emits JSON updates only when workspace/window state changes.
- **App-aware coloring** — built-in colors for Chrome (red), Firefox, Discord/Vesktop, Spotify, Todoist, Gmail, and terminals.
- **Terminal app detection via `/proc`** — detects `jcode`, Claude, Codex, and Neovim/Vim running inside terminal windows.
- **Terminal support** — works with Alacritty, Kitty, Ghostty, Foot, and Footclient.
- **Focus semantics** — uses `█` for the focused window, `▌` for the active window on an unfocused workspace, and `|` for other windows.
- **tmux hinting** — uses `¦` for non-focused tmux windows.
- **Cleaner empty workspace handling** — unfocused empty workspaces are hidden; a focused empty workspace is shown as a dim `·`.
- **Named workspace support** — shows the custom workspace name when that workspace is focused; tooltips include only non-empty workspaces.
- **Safer terminal PID detection** — skips `/proc` descendant inference for shared terminal PIDs in cases that can otherwise cause false positives.
## Benchmarks
| Metric | Value |
|--------|-------|
| Memory | 2.5 MB RSS |
| CPU per update | ~1.1ms |
| 80 rapid switches | ~90ms total CPU |
### Comparison
| Approach | CPU per update |
|----------|---------------|
| Bash script | ~340ms |
| Rust + signal | ~12-14ms |
| Rust daemon | **~1.1ms** |
The daemon is **~10-12x faster** than the signal-based approach and **~300x faster** than the original bash script.
## Installation
```bash
cargo build --release
cp target/release/niri-workspaces ~/.config/waybar/
```
If Waybar is already running, restart Waybar or reload the module so the new binary is picked up.
## Waybar Configuration
```json
"custom/workspaces": {
"exec": "~/.config/waybar/niri-workspaces",
"return-type": "json",
"format": "{}"
}
```
No `interval` or `signal` is needed — the daemon outputs JSON whenever relevant niri events occur.
## License
MIT
|