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.
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
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.
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)
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>
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>
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>
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>
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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:
SUPER+NSUPER+spaceThe 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.verticalOutputsreplaces noctalia's per-monitor wallpaper handling; konishi sets it toDP-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+Nagain.Verification
All five configurations evaluate;
naps62@konishibuilds.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 —Two bugs found and fixed that way:
bluetoothctlhangs forever rather than erroring when there is no adapter, so the script checks/sys/class/bluetoothand caps each call withtimeout 2; and:homogeneousis not a box attribute in eww 0.6.🤖 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.
How the numbers were taken
Disk — closure difference between
mainand this branch,naps62@konishihome generation, self sizes not closure sizes: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, whicheww-panelalways 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
76374ab21cto39cc3f2cd0yuck 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>