11 KiB
Migration findings: ~/wrk/dotfiles (old) → ~/.dotfiles (new)
Exploratory session comparing the archived i3/X11/bash dotfiles repo
(~/wrk/dotfiles, GitHub, 2023-2025) against the current bare-repo setup
(~/.dotfiles, Gitea, started 2026-07-03) on a fresh CachyOS + KDE Plasma
(Wayland) machine. Goal: not a literal port — for each old feature, decide
whether CachyOS/KDE already covers it for free (skip) or whether it needs an
equivalent tracked in the new repo (port). Nothing below has been
implemented yet; this is a planning doc only.
Resolved — no action needed (already covered by KDE/CachyOS defaults)
- Package management split (old:
pacman.gui/nogui+aur.gui/nogui+ Makefile/aurman installer). Newdot install+ flatpackages/pacmanstays as-is — no plan to port the old list wholesale, just add packages as needed. - Touchpad
xorg.conf—kcminputrc/System Settings has caused no issues; not tracking it. - i3 tiling paradigm (focus-by-direction, split/layout toggle, floating
toggle, resize, move-by-pixel, gaps, borders) — dropped entirely. No KWin
tiling script (Polonium/Bismuth/Krohnkite) installed or wanted; primary
tiling-like workflow now happens in tmux. KDE's native floating +
quick-tile (
Meta+Arrow) is accepted as-is. - i3 workspace switch/move (
Super+1-9,0/Super+Shift+1-9,0) — already matched by existing KDE defaults:Meta+1-9(Switch to Desktop N),Meta+Shift+1-9i.e.Meta+!/@/#/...(Window to Desktop N). - Desktop count — KDE has 9 virtual desktops configured; confirmed sufficient, no change to 10.
- Workspace/window assignment rules (
assign firefox → ws1,plexamp → ws10) — skipped.kwinrulesrcstays empty for now. - Kill/reload/restart WM keys — functionally covered by KDE defaults
(
Alt+F4close,Meta+Ctrl+Esckill window). - Terminal launch (
Super+Return→ alacritty) — already identically bound:Meta+Return→ Alacritty, confirmed inkglobalshortcutsrc. - App launcher (rofi) — superseded by KRunner (default
Alt+Space/Alt+F2). - Media keys (volume, mic mute, play/pause/next/prev) — already covered
natively via hardware key bindings, exceeding the old
wpctl+playerctlsetup. - Brightness/backlight keys — already covered via hardware
Monitor Brightness Up/Downbindings (powerdevil). - picom, Xresources, dracula color theme — dropped. Not using dracula going forward; kwin compositor replaces picom with no config needed.
- rofi power menu (lock/shutdown/restart/switch-user) — covered by
existing KDE defaults:
Meta+L(Lock Session),Ctrl+Alt+Del(Show Logout Screen = full power menu). Note:Meta+Lwill be reassigned, see below — Lock Session needs to move toMeta+X. - polybar → Plasma panel — nearly the entire module set already exists
as stock, unmodified Plasma panel defaults on this machine: workspace
indicator → Pager applet, battery → Battery applet (machine has
BAT0), backlight → Brightness applet, date/time → Digital Clock applet, volume → system tray audio, now-playing → Media Controller applet (present, just nothing to show — no MPRIS player installed currently). Only non-exact match is polybar's centered window-title label (closest KDE equivalent is the icon-only taskbar) — decided not worth adding a dedicated Window Title applet. Whole row needs no tracking; see also the panel-layout finding below (it's CachyOS's own shipped default, reproduces automatically).
Resolved — needs porting (design agreed, not yet built)
- Extra groups (old:
.extra_groups→video,dockerviasetup_usersinbin/dot init). Missing in new repo; not urgently needed yet but a real gap.- Architecture decision: new
dotsubcommand, e.g.dot setup(name tentative), separate fromdot init.dot initstays scoped to the one-shot bootstrap (clone + checkout) and explicitly refuses to re-run;dot setupis idempotent/re-runnable and is the new home for machine-setup tasks (extra groups, folder layout, future ones), mirroring the oldbin/dot init'ssetup_users/setup_folderssub-task split.
- Architecture decision: new
- Folder naming / XDG dirs (old:
setup_foldersrenamedDesktop→.desktop,Documents→doc,Downloads→dwn,Music→mus,Pictures→pic,Videos→vid,Templates/Public→.ignoreme).- Decision: restore the short-name convention (better for fish
autocompletion — shorter shared prefixes, e.g.
doc/dwnonly share one character vsDocuments/Downloads). - Replace old
Projects-style folder withwrk(matches the existing~/wrkdirectory already in active use, e.g.~/wrk/dotfiles). user-dirs.dirscurrently untracked and diverged (has full names + an ad hocXDG_PROJECTS_DIR=$HOME/Projectsnot in the old file at all). Needs to be regenerated to the short-name convention (withwrk) and then tracked, as part of thedot setupfolders task.
- Decision: restore the short-name convention (better for fish
autocompletion — shorter shared prefixes, e.g.
- Caps-lock/Escape swap — user confirmed this needed manual
configuration (
kxkbrc:Options=caps:escape_shifted_capslock), it is not a KDE default. Needs tracking. No kcfg schema backs this setting — it's a freeform string; "default" = theOptions=line being absent entirely. Simple to declare directly, no diffing tooling needed for this one. - Screenshots (old:
Print/Ctrl+Print/Shift+Printviamaim+xclip→~/pic/screenshots/, save + clipboard copy).- New keybinds:
Meta+L= full-screen capture,Ctrl+Meta+L= select region,Shift+Meta+L= window capture — all via Spectacle (built-in capture + clipboard;maim/xclipnot needed,xclipisn't even installed). - Consequence:
Meta+Lis currently KDE's default Lock Session shortcut — must be freed and Lock Session rebound toMeta+X. - Folder: rename Spectacle's default save-folder name from
Screenshots(capital) to lowercasescreenshots, matching the rest of the short-folder convention. - Open detail: exact Spectacle shortcut action IDs (likely
FullScreenScreenShot,RectangularRegionScreenShot,ActiveWindowScreenShot) need to be verified via System Settings → Shortcuts at implementation time — onlyCurrentMonitorScreenShotandOpenWithoutScreenshotshow up in the currentkglobalshortcutsrcdump (both unset), the others aren't customized yet so don't appear there.
- New keybinds:
KDE config-tracking architecture (cross-cutting decision)
Problem: KDE rc files (kxkbrc, kglobalshortcutsrc, kwinrc,
plasma-org.kde.plasma.desktop-appletsrc, kdeglobals, etc.) mix real user
intent with large amounts of machine-specific/volatile noise (timestamps,
UUIDs, window state, plugin caches). Whole-file tracking (what naive
dotfiles repos do, e.g. dnephin/dotfiles) produces noisy diffs and risks
clobbering machine-specific state.
Considered and rejected (for now): chezmoi_modify_manager-style
filtered source-of-truth + merge script. Powerful (tracks a minimal "intent"
INI fragment + per-file ignore/set rules, merges onto the live file), but
it's real tooling to build from scratch outside of chezmoi, and not
justified yet for the ~2 settings currently in scope.
Decision: track KDE settings as a declarative list of key/value pairs
applied imperatively via kwriteconfig6, run through dot setup (or
wherever machine-setup tasks land, see above) — not one-off hand-written
kwriteconfig6 calls accumulating over time.
Auto-detection tooling to build (exploratory design only — not implemented):
- Command:
dot config kde— deliberately dispatchable, implies adot config <target>family with room for non-KDE targets later. - Language: Python 3 (already installed) for XML/kcfg parsing — nested
<group>/<entry>/<default>structures are painful to parse in fish/xmllintone-liners. Invoked from a fish wrapper (~/.config/dot/commands/config.fish→_dot_config→ sub-dispatch to KDE logic), following the existing help-then-argparse /_dot_<name>_usageconvention. - Coverage: as broad as possible across known KDE rc files, not just
kwinrc— files/settings with nothing customized are expected to return empty, that's fine. - Per-file-type handling (three different mechanisms, no single
approach covers everything):
kglobalshortcutsrc— self-describing, no schema needed. Each line isAction=Current,Default,FriendlyName; diff field 1 vs field 2, report only mismatches. Fully automatic.- KConfigXT schema-backed settings — real schemas exist at
/usr/share/config.kcfg/*.kcfg(41 files on this machine) with<default>tags per<entry>inside<group>blocks. Caveat: not every kcfg statically declares its target rc file — some use<kcfgfile arg="true" />(e.g.kwin.kcfg), meaning the target file is supplied at runtime by the owning app, not in the XML. Full automatic discovery isn't possible in all cases; a curated(rcfile → [kcfg files])mapping table needs to be hardcoded from domain knowledge — confirmed acceptable. Knownkwinrcmapping so far:virtualdesktopssettings.kcfg,kwindecorationsettings.kcfg,workspaceoptions_kwinsettings.kcfg, several accessibility kcfg files, pluskwin.kcfgitself (needs manual mapping,arg="true"). For each entry: read the live value viakreadconfig6 --file <rcfile> --group <group> --key <key>and compare against the schema's<default>. - Freeform/schema-less string settings (e.g.
kxkbrc'sOptions=line) — no kcfg exists; "default" simply means the key/line is absent. Trivial, no diffing tooling needed, just declare directly. - Plasma panel layout (
plasma-org.kde.plasma.desktop-appletsrc) — not schema-based at all; generated once from a shippedlayout.js. Confirmed CachyOS ships its own look-and-feel/layout (/usr/share/plasma/look-and-feel/CachyOS-Nord/), not vanilla KDE Breeze — so the current panel is "default" by construction and reproduces automatically on any fresh CachyOS install. No tracking needed, no diffing possible/necessary. - Empirical fallback (not needed yet, noted for completeness): for
anything not covered by the above, spin up a scratch
HOME/XDG_CONFIG_HOME, let the app initialize its config fresh, diff against the real file.
Status: design only, per explicit instruction — do not implement until asked.
Also noted, not yet actioned
- Once any of the above keybind changes are actually made (screenshot
rebinds,
Meta+L→Meta+Xlock move, etc.), remember the project's own convention: add/update rows in~/.github/keybindings.mdfor each changed keybind, per~/.config/dot/CLAUDE.md.