feat: replace noctalia with an eww panel #3

Merged
naps62-yolo merged 6 commits from eww-shell into main 2026-08-19 15:13:05 +01:00
Collaborator

Draft. Untested on real hardware — everything below was verified headless, so the layout will want tuning once you see it on a 4K screen.

Removes noctalia and its flake input. It was doing six jobs; each is now a separate binary-cached package, so nothing in this stack builds from source:

job replacement
control centre eww overlay, SUPER+N
launcher fuzzel, SUPER+space
wallpaper wpaperd, waypaper as picker
notifications mako
polkit agent hyprpolkitagent
qt + zathura colours static dark values, no generated files

The panel shows clock, battery, network and bluetooth, plus buttons for next wallpaper, pick wallpaper, bluetooth power and lock. The battery row hides itself where there is no BAT*. Rows close the panel and open the real app — nm-connection-editor, blueman-manager, waypaper.

custom.hyprland.verticalOutputs replaces noctalia's per-monitor wallpaper handling; konishi sets it to DP-2.

Two things this does not carry over: light/dark theme switching (darkman no longer repaints anything but GTK and the cursor), and the panel does not close on click-outside, only on SUPER+N again.

Verification

All five configurations evaluate; naps62@konishi builds.

The panel was run headless under Xvfb against the generated eww.yuck: window opens, no parse warnings, and every poll returns real data on this machine —

battery   {"present":false,...}                              (no BAT* here)
network   {"icon":"󰈀","label":"Wired connection 1","sub":"Ethernet"}
bluetooth {"powered":false,"label":"No adapter",...}
clock     12:43 / quarta, 19 agosto

Two bugs found and fixed that way: bluetoothctl hangs forever rather than erroring when there is no adapter, so the script checks /sys/class/bluetooth and caps each call with timeout 2; and :homogeneous is not a box attribute in eww 0.6.

🤖 Generated with Claude Code

Draft. Untested on real hardware — everything below was verified headless, so the layout will want tuning once you see it on a 4K screen. Removes noctalia and its flake input. It was doing six jobs; each is now a separate binary-cached package, so nothing in this stack builds from source: | job | replacement | |---|---| | control centre | eww overlay, `SUPER+N` | | launcher | fuzzel, `SUPER+space` | | wallpaper | wpaperd, waypaper as picker | | notifications | mako | | polkit agent | hyprpolkitagent | | qt + zathura colours | static dark values, no generated files | The panel shows clock, battery, network and bluetooth, plus buttons for next wallpaper, pick wallpaper, bluetooth power and lock. The battery row hides itself where there is no `BAT*`. Rows close the panel and open the real app — `nm-connection-editor`, `blueman-manager`, `waypaper`. `custom.hyprland.verticalOutputs` replaces noctalia's per-monitor wallpaper handling; konishi sets it to `DP-2`. Two things this does not carry over: light/dark theme switching (darkman no longer repaints anything but GTK and the cursor), and the panel does not close on click-outside, only on `SUPER+N` again. <details> <summary>Verification</summary> All five configurations evaluate; `naps62@konishi` builds. The panel was run headless under Xvfb against the generated `eww.yuck`: window opens, no parse warnings, and every poll returns real data on this machine — ``` battery {"present":false,...} (no BAT* here) network {"icon":"󰈀","label":"Wired connection 1","sub":"Ethernet"} bluetooth {"powered":false,"label":"No adapter",...} clock 12:43 / quarta, 19 agosto ``` Two bugs found and fixed that way: `bluetoothctl` hangs forever rather than erroring when there is no adapter, so the script checks `/sys/class/bluetooth` and caps each call with `timeout 2`; and `:homogeneous` is not a box attribute in eww 0.6. </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code)
naps62-yolo marked the pull request as work in progress 2026-08-19 12:46:39 +01:00
Author
Collaborator

Measured what noctalia actually costs, because the "it's overkill" framing above only holds for one of the two resources.

Disk: this change makes things worse. noctalia's Qt6 stack is already shared with the rest of the config, so it only adds ~64 MiB of its own — the package (41 MiB) plus libqalculate and gnuplot for its calculator widget. The replacement stack adds ~170 MiB, mostly numpy (waypaper is Python) and Kirigami (pulled in by hyprpolkitagent). Net +106 MiB.

Memory: this change is the win. noctalia is ~126 MB resident against ~34 MB for the eww daemon, and that gap will widen on konishi, where noctalia also paints wallpaper on three 4K outputs.

So the case for this PR is memory and build time, not disk. If disk matters more than either, pinning the input (#2) gets most of the benefit for none of the churn.

How the numbers were taken

Disk — closure difference between main and this branch, naps62@konishi home generation, self sizes not closure sizes:

only on main:        noctalia 41, libqalculate 10, gnuplot 3, wireplumber 2, misc   ≈  64 MiB
only on this branch: numpy 51, eww 22, ki18n 17, kirigami 12, wpaperd 11,
                     kirigami-addons 9, blueman 6, ...                              ≈ 170 MiB

Total closures are 32.1 GiB and 32.2 GiB respectively.

Memory — both run under headless sway on one output, same machine. The eww figure is the daemon idle: the panel window itself would not open headless (GTK could not pick a primary monitor without an explicit --screen, which eww-panel always passes on Hyprland), so treat 34 MB as a floor.

Not measured: build time, and neither figure comes from konishi itself.

🤖 Generated with Claude Code

Measured what noctalia actually costs, because the "it's overkill" framing above only holds for one of the two resources. **Disk: this change makes things worse.** noctalia's Qt6 stack is already shared with the rest of the config, so it only adds ~64 MiB of its own — the package (41 MiB) plus libqalculate and gnuplot for its calculator widget. The replacement stack adds ~170 MiB, mostly numpy (waypaper is Python) and Kirigami (pulled in by hyprpolkitagent). Net +106 MiB. **Memory: this change is the win.** noctalia is ~126 MB resident against ~34 MB for the eww daemon, and that gap will widen on konishi, where noctalia also paints wallpaper on three 4K outputs. So the case for this PR is memory and build time, not disk. If disk matters more than either, pinning the input (#2) gets most of the benefit for none of the churn. <details> <summary>How the numbers were taken</summary> Disk — closure difference between `main` and this branch, `naps62@konishi` home generation, self sizes not closure sizes: ``` only on main: noctalia 41, libqalculate 10, gnuplot 3, wireplumber 2, misc ≈ 64 MiB only on this branch: numpy 51, eww 22, ki18n 17, kirigami 12, wpaperd 11, kirigami-addons 9, blueman 6, ... ≈ 170 MiB ``` Total closures are 32.1 GiB and 32.2 GiB respectively. Memory — both run under headless sway on one output, same machine. The eww figure is the daemon idle: the panel window itself would not open headless (GTK could not pick a primary monitor without an explicit `--screen`, which `eww-panel` always passes on Hyprland), so treat 34 MB as a floor. Not measured: build time, and neither figure comes from konishi itself. </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code)
naps62-yolo added 1 commit 2026-08-19 13:26:21 +01:00
feat: replace noctalia with an eww panel
CI / lint (pull_request) Successful in 31s
CI / eval (pull_request) Successful in 2m19s
39cc3f2cd0
Drops the noctalia shell and its flake input. It was doing six jobs; each is
now a small binary-cached package, so nothing builds from source:

- control centre -> an eww overlay, SUPER+N, opening on the focused monitor
- launcher       -> fuzzel, SUPER+space
- wallpaper      -> wpaperd, with waypaper as the picker
- notifications  -> mako
- polkit agent   -> hyprpolkitagent
- qt/zathura theming -> static dark colours instead of generated ones

The panel shows clock, battery (hidden where there is none), network,
bluetooth, plus buttons for next/pick wallpaper, bluetooth power and lock.

custom.hyprland.verticalOutputs replaces noctalia's per-monitor wallpaper
handling; konishi sets it to DP-2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
naps62-yolo force-pushed eww-shell from 76374ab21c to 39cc3f2cd0 2026-08-19 13:26:21 +01:00 Compare
naps62-yolo added 1 commit 2026-08-19 13:33:40 +01:00
fix: detach the panel's launched apps from eww
CI / lint (pull_request) Successful in 38s
CI / eval (pull_request) Successful in 2m10s
4a8e0241e4
eww kills the onclick handler's process group when the window it came from
closes, so `eww close panel; <app>` never reached the app. Launch through
setsid first, close the panel after.

loginctl was also unqualified, which a systemd user unit's PATH does not cover.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
naps62-yolo added 1 commit 2026-08-19 14:22:19 +01:00
feat: make the panel a centered dashboard with audio
CI / lint (pull_request) Successful in 29s
CI / eval (pull_request) Successful in 1m53s
db0e1aea32
Reshapes the corner strip into a centered card grid over a dimmed backdrop,
which also gives it click-outside-to-close.

Adds an Audio card: speaker and mic sliders driven by wpctl, each with a mute
toggle. Rows hide themselves when the node does not exist, same as battery.

custom.hyprland.panelScale multiplies every length in the stylesheet; konishi
sets 1.6 for its 4K outputs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
naps62-yolo added 1 commit 2026-08-19 14:27:54 +01:00
fix: make the audio sliders actually set volume
CI / lint (pull_request) Successful in 29s
CI / eval (pull_request) Successful in 1m48s
8e5feb8522
yuck interpolates ${...}, not {...}, so wpctl was being handed a literal
"{node}" and failing; the slider snapped back on the next poll.

Also drops the full-screen backdrop. It gave click-outside-to-close, but its
handler fired for clicks on the sliders too, closing the overlay mid-drag.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
naps62-yolo added 1 commit 2026-08-19 14:31:30 +01:00
fix: match the real blueman window class
CI / lint (pull_request) Successful in 28s
CI / eval (pull_request) Successful in 1m48s
3e3c7f1b57
nixpkgs wraps blueman with --inherit-argv0, so the class is blueman-manager,
not the .blueman-manager-wrapped the rule expected. It never floated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
naps62-yolo added 1 commit 2026-08-19 15:12:54 +01:00
Merge remote-tracking branch 'origin/main' into eww-shell
CI / lint (pull_request) Successful in 30s
CI / eval (pull_request) Successful in 2m16s
fda1bf2985
naps62-yolo marked the pull request as ready for review 2026-08-19 15:13:00 +01:00
naps62-yolo merged commit a0a69cf58c into main 2026-08-19 15:13:05 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: naps62/nixos-config#3