# Dots — TODO Backlog after the HyDE modernization (legacy Hyprdots → current HyDE), merged to `main` 2026-07-22. Hosts: **lw** current HyDE (active); **wm** current HyDE (not set up yet); **fl** KDE (future: bare Hyprland). ## Key architecture note (learned 2026-07-23) On current HyDE, **waybar's `config.jsonc` is generated by `waybar.py` from the active *layout*** in `~/.config/waybar/layouts/` (active layout tracked in `~/.local/state/hyde/staterc`). So the dots manage the **layout + module defs**, NOT `config.jsonc` (HyDE overwrites it). Also: the Arch `waybar` build has **no native `cava`** module — use the script module `custom/cava` → `hyde-shell cava.py waybar --json`. ## Cava (working on lw — remaining polish) The rig: `layouts/custom.jsonc` + `layouts/custom.css` = **two bars launched standalone** (`waybar -c …custom.jsonc -s …custom.css`, exec-once in userprefs.conf) — transparent main bar (top layer) over a full-width `custom/cava` bar behind it (bottom layer; `margin-top: -33` cancels the main bar's exclusive-zone displacement). **NOT HyDE-managed** — the raw `waybar -c` bind on `keybindings.conf:39` IS the launcher/toggle; keep it as-is. Deployed on lw 2026-07-25: HyDE's bar unit stopped + masked, rig live. **HyDE ownership rules (learned the hard way 2026-07-25):** HyDE's `waybar.py` *writes* `~/.config/waybar/config.jsonc` AND `~/.config/waybar/style.css` (any `--set`/`--update` clobbers them — through the stow symlink, i.e. into the repo checkout!). `theme.css` is wallbash-generated on theme change. The rig therefore keeps its own files in `layouts/` (never written by HyDE) and only *imports* `../theme.css`. HyDE's bar itself is systemd unit `hyde--bar.service` behind a `waybar.py --watch` auto-restarter launched by `startup.conf` (`$start.BAR` — not overridable from user config; `variables.conf` re-sets it after any user assignment). - [ ] **`theme.css` is dirty-prone on lw**: wallbash writes through the dots symlink on every theme change — decide: untrack it like config.jsonc (rig imports the live generated file either way) or keep a pinned fallback for non-HyDE hosts (fl). Check `git status` on lw after a theme switch. - [ ] Tune `cava.width` per host if the bars don't span the screen (gui default 94; wm overrides to 218). - [ ] Icon map on the **HyDE-managed** bar (if ever unmasked/used again): `modules/window.jsonc` carries the same map; if titles lack icons there, `includes.json` overrides it and the def must move there. - [ ] Upstream HyDE **deprecated the header/footer module fragments** (its `footer.jsonc` is now a `{}` stub; padding defs move to `custom-module.jsonc`). Our old-style `modules/footer.jsonc` still works with the current generator — re-check against upstream at the next HyDE update (only matters if the managed bar is revived). ## Hardware-gated (needs the physical box) - [ ] **Bring `wm` onto current HyDE:** install HyDE framework (`~/HyDE/Scripts/install.sh`), `dotsync`, relogin, `hyprctl configerrors`; watch wm-specific `nvidia.conf` / `monitors.conf` — monitors.conf carries a FIXME (`eDP-1` is a laptop panel name on a desktop; check `hyprctl monitors` for the real outputs first). Then the same one-time bar disable as lw (gui's exec-once launches the rig here too): `systemctl --user stop hyde--bar.service` + `mask` (name via `systemctl --user list-units 'hyde*'` if unsure). - [ ] **`fl` → bare Hyprland: deferred to flip-time.** Not worth a partial `windowrulev2` conversion now — fl is dormant KDE, and when it flips it needs the *full* treatment (HyDE framework sourcing + rules), done in-context like lw's was. Its only deprecated syntax is `windowrulev2` (windowrules.conf ×67, userprefs.conf ×18). ## Small / whenever - [ ] `git push origin --delete worktree-hyde-modernize` — fully merged into main; remote copy is stale. - [ ] `reconcile-hyde.sh` SUBTREES = `hypr`+`waybar` only — add `rofi` **if** rofi ever becomes dots-tracked (not yet). - [ ] Waybar add and fix all nerd font icons - [ ] keybind initialization failed, $mainMod + / - [x] ~~Make all .file -> dotfile, because Telescope search is ignoring them~~ — solved 2026-08-08 *without* renaming anything: repo-root `.ignore` un-hides dotdirs for rg/fd/telescope, and `FZF_DEFAULT_COMMAND=fd` points fzf (whose own walker ignores `.ignore`) at fd. - [ ] **pi-vim on the other hosts (lw/fl/wm):** the tracked `settings.json > packages` gets `pi install npm:pi-vim` done, but the AUR pi build can't resolve its embedded `@earendil-works/*`, so the extension won't load until the peer dep is installed by hand — `cd ~/.pi/agent/npm && fnm exec --using=22 -- npm install @earendil-works/pi-coding-agent@$(pi --version)`. Full rationale in `common/.pi/CLAUDE.md` (Vim input editor). - [x] ~~`git rm` the parked `vim-editor.ts.disabled`~~ — done 2026-08-09, pi-vim confirmed good in daily use. Recover with `git show c6566af^:common/.pi/agent/extensions/vim-editor.ts` if ever needed. ## Back-ported from dots-wm (2026-08-08) — verify on lw The wm migration surfaced bugs that were live in `.dots` (and so on lw). Fixes are ported; these are the checks that were only ever reproduced on wm. Full rationale: dots-wm `MIGRATION-TEST.md` "Back-port list". - [ ] **lw: confirm the hypr fixes took.** `grep -cE 'globbing error|Error parsing gradient' /run/user/1000/hypr/*/hyprland.log` (should be 0 — catches the `$ANIMATION_PATH` fix) and `hyprctl getoption decoration:rounding` (`set: true`; `set: false` = nothing ever assigned it). `hyprctl configerrors` is useless here — it returns empty for a missing `source =`, which is what hid all of this. - [x] ~~lw: retune hyprlock sizes~~ — done 2026-08-08 via a per-host hook: `hyprlock.conf` sources `~/.config/hypr/hyprlock-host.conf`, shipped empty in `gui/` (so the source always resolves — a missing target is a hard parse error, and for hyprlock that means the lock screen fails) and overridden in `lw/` with the 1920x1080 set. - [ ] **lw: check hyprlock on the built-in panel.** The 1080p sizes are for the externals; `monitors.conf` makes `$mainScreen` (eDP-1) 1366x768 and hyprlock draws on every output, so the clock reads ~18% of height there instead of ~13%. A 768-tuned set is in the comment at the top of `lw/.config/hypr/hyprlock-host.conf` if the laptop panel is the one that matters. - [ ] **wm: `cantarell-fonts` + `adobe-source-code-pro-fonts`** for hyprlock's `$timeFontFamily`/`$fontFamily` (both OFL-1.1, both in `extra`). Installed on lw 2026-08-08; wm needs them at migration time. A missing family degrades silently to a fallback whose metrics are not what the layout offsets were tuned against — install *before* judging the lock screen's spacing on a new host. - [x] ~~lw: check the lock screen has a wallpaper~~ — confirmed 2026-08-08. It had been pointing at `~/sync/Drive/pics/`, which does not exist on lw either; the in-repo `hypr/hyprlock/assets/` fixed it, once `./install.sh` had actually linked them (a pull alone does not — new files). - [ ] **wm's old-HyDE window** (decided 2026-08-08: `hypr/themes/{colors,theme,wallbash}.conf` are NOT being added — wm's HyDE is updated right after this merge, which makes them obsolete). The gap is the interval: if wm runs `~/.dots` while still on the *old* HyDE, that HyDE hard-sources all three and Hyprland silently falls back to compositor defaults (border 1, rounding 0, gaps_out 20, no blur) while `hyprctl configerrors` still reports clean. So update wm's HyDE with/before the switch — or copy the three out of dots-wm into `wm/` as a stopgap. - [ ] **Capture `.config/hyde/` before dots-wm is abandoned.** `config.toml` + `wallbash/` (`always/{cava,chrome}.dcol`, `scripts/{cava,chrome,code}.sh`, `theme/code.dcol` — 8 files, ~2.5k lines) exist in dots-wm and in **no** package here. Not an intentional exclusion: `.gitignore` only drops the generated `**/hyde/themes/`, and `reconcile-hyde.sh` SUBTREES covers just hypr+waybar. Best captured *after* wm's HyDE update — its installer rewrites `~/.config/hyde`, so taking it now banks soon-stale content. `gui/` is the natural home (the wallbash templates theme the cava bar), but check lw for real files there first: a stow conflict aborts the entire package (same failure as the claude/settings.json item). - [x] ~~`~/.config/claude/settings.json` is a real file, not a stow link~~ — reconciled 2026-08-08. Claude Code had replaced the symlink with a real file, so `./install.sh` aborted **all** of `common` (gui still stowed), meaning no new file under `common/` could deploy on this host. It had not actually lost keys — all 20 were present, the apparent loss was key *reordering* from Claude Code rewriting the file. Only `model` differed, so the live value (`claude-fable-5[1m]`) was written into the repo copy and the symlink restored; `install.sh` is clean again. Watch for it recurring: anything that rewrites a stowed file in place instead of through the link re-severs it. - [ ] **Before making the repo public: confirm the hyprlock images' provenance.** `gui/.config/hypr/hyprlock/assets/{background.jpg,logo.jpg}` came over from dots-wm with EXIF stripped, so nothing in the files says where they're from. GPL-3 can't relicense someone else's photo. Everything else is settled: HyDE-derived configs are GPL-3 like this repo, `dark.tmTheme` is MIT with its header intact, and the fastfetch PNGs are third-party marks used nominatively (see README "Third-party content and licensing").