While the popout is open, poll both status and metrics at a fast cadence
(kubeRefreshOpenMs, 3s) instead of 2min/15s, and refresh immediately when
it opens — so opening the pill shows fresh data and updates live. Status
reverts to the slow 2min pill cadence once closed.
The sliding active indicator positioned itself via Repeater.itemAt(), which
returns null mid-rebuild; the fallback then stranded it at the top (looked
like workspace 1 was active while the font correctly showed another). Cells
are uniform, so compute the indicator's y arithmetically from the index
instead. Also make monitorWsData's sort deterministic: numbered workspaces
ascending, then named ones (e.g. joplin) alphabetically — parseInt alone
yields NaN and an unstable order for named workspaces.
no_hardware_cursors auto (2) still corrupts the cursor on the rotated
vertical monitor, and Hyprland has no per-monitor override, so force
software cursors (1) globally.
hl.animation rejects a spring leaf without a speed (Hyprland logged
"missing required field speed"), so windowsIn fell back to default. Add
speed so the snappy spring actually applies.
GamemodePill is instantiated per screen Variant, so it spawned one
long-lived gdbus monitor per monitor (3 on desktop). Move the watcher into
a shared Gamemode singleton so only one runs regardless of screen count.
swaylock broke and the stack already locks with hyprlock everywhere else;
point the desktop lockCommand and power menu at hyprlock and drop the
now-identical laptop/desktop branches.
The metrics poller spawned the heavy k8s-metrics script every 15s all day
even though its data only renders in the popout. Gate it on the popout
being open (triggeredOnStart fetches immediately on open) and slow the
pill's status poll from 30s to 120s.
no_hardware_cursors 2 (auto) uses hardware cursors where supported and
falls back to software only when needed, instead of forcing software
cursors globally.
These scratch HTML mockups and .server runtime files were tracked in the
source tree and would be applied into ~/.config. Remove them and ignore
the directory.
The pill and popout each picked an active MPRIS player independently, so
with multiple players open they disagreed and flipped. Add a Media
singleton that selects one active player with stickiness and bind both
components to it.
Feed the three kubectl outputs into one jq program that does app
aggregation, CPU/memory unit normalization, and quota math, replacing the
per-pod jq fork loops and eight quota jq reads (~40 forks down to ~4).
Replace the per-tick sh -c subprocess reads in the system popout with
Quickshell FileView reads (/proc/stat, /proc/meminfo, and once-resolved
hwmon/battery sysfs paths), dropping the 5s tick from ~7 process spawns to
~2. Wrap checkupdates in timeout 120 and guard against restarting an
in-flight run so a slow sync can no longer thrash or stall.
Lua config (hyprland.d.lua):
- keybinds: layout-aware binds now read the per-workspace layout via
cur_ws_layout() instead of the global hl.get_config("general.layout"),
fixing mouse-wheel/bracket scrolling and ratio keys on the lua:*-scroll
layouts.
- add state.lua shared module (ws_layouts) replacing the _G globals.
- layout: factor the 9 duplicated layout_msg bodies into scroll_msg/swap_msg
builders; drop a dead #state expression.
- rules: NO_BLUELIGHT window.open handler no longer leaks a rule per open
(one per class) and regex-escapes/nil-guards the class.
- monitors: quote non-numeric scale so scale="auto" renders.
- drop debug print() focus handler, local-next shadowing, stray {mouse=true}
on wheel binds (kept on drag/resize, which require it).
Quickshell:
- brightness OSD is now event-driven: Osd.qml gains an IpcHandler(target:osd)
and the keybind pushes the new level via `qs ipc call osd brightness`,
removing the always-on 500ms brightnessctl poll.
- GamemodePill watches GameMode's D-Bus signals via gdbus monitor instead of
polling gamemoded --status every 5s.
Cleanup:
- remove stock hyprland.lua.refactor/ boilerplate and the redundant,
partly-wrong hyprland_lua_api.md (both were deployed into ~/.config/hypr;
.luarc.json already points the LSP at /usr/share/hypr/stubs).
- refresh hypr/AGENTS.md (lua layout) and quickshell/CLAUDE.md (v0.3.0).
Replace nwg-hello with hyprlogin as the greetd greeter. Both hyprlock
and hyprlogin now share a single apex-neon theme fragment
(.chezmoitemplates/apex-neon-lock.conf), giving an identical look on
lock and login.
- Add system/ staging tree for /etc files (not auto-applied by chezmoi)
- Add system/install-greeter.sh to render templates and sudo-install to /etc
- Add apex-neon shared fragment: palette, font, animations, input-field,
clock/date bubbles, weather/location bubbles
- Add dot_config/hypr/themes/apex-neon-lock.conf.tmpl ($HOME copy for hyprlock)
- Rewrite hyprlock.conf.tmpl to source the shared fragment; move
notification bubble here (hyprlock-only, requires quickshell)
- Add Quickshell IpcHandler so `qs ipc call notifications count` works
- Session fixed to hyprland-uwsm.desktop; greetd config targets greetd.conf
Alt+. now cycles through all whitespace-split tokens from history
(most recent first, last arg first within each command) using env
var state. Alt+, opens a skim fuzzy picker over full history commands
and inserts the selected entry at the cursor.
- keybindings block in config.nu with Alt+. → insert last token from history
- nushell.github.io added as external_nushell-book submodule under dot_local/share/docs
- CLAUDE.md local docs table updated
Template Config.qml with chezmoi data for multi-machine support. Surface
gets eDP-1 monitor, battery/power-profile widgets, no discrete GPU or
Kubernetes polling. Desktop behavior unchanged.
Initial nushell dotfiles: config, modules (git, k8s, sys, hypr, pkg,
dev), apex theme files, and a chezmoi-templated prompt that shows dir
and git branch/dirty using apex-neon/aeon colors with vi mode indicators.
Replace hypr-workspace-layout shell script with native Lua functions in
keybinds.lua. Add custom Lua layouts (master-scroll variants, swap
variants) to the SUPER+period cycle. Implement swap-on-focus via
_G._hl_ws_layouts shared global so window.active handler can check
per-workspace layout without IPC or hl.get_workspaces().
Port all layout management to Hyprland v0.55 Lua API:
- Per-workspace layout toggle/cycle via hl.workspace_rule + hl.get_active_window()
- Layout-aware move/nav/resize as pure Lua functions
- Group smart-join via hl.get_active_window().grouped
- mfact exact handlers in all custom scroll/swap layouts
- No io.popen, no exec_cmd, no IPC deadlock risk
New scroll layouts for vertical monitors:
- top-master-scroll: master top, horizontal slave row below
- center-master-scroll-v: master center, slave rows above and below
New swap-on-focus layouts (focusing a slave promotes it to master):
- master-swap: master left, slaves right
- slave-master-swap: master right, slaves left
- top-master-swap: master top, slaves bottom
Shared place_scroll_row helper (horizontal mirror of place_scroll_col).
Guard recalc dispatch by layout name to avoid errors from built-in layouts.