aboutsummaryrefslogtreecommitdiffstats
path: root/install.sh
AgeCommit message (Collapse)AuthorFilesLines
5 daysfeat(rofi): wallpaper banner and placeholder on the ssh headerDanilo M.1-7/+8
The header and search bar share the wallpaper banner the Alt+F2 runner uses, each on a plate so it stays legible over any image, and the entry gets a placeholder. ssh.rasi now carries the @WPAPER@ placeholder, so install.sh generates it like launcher.rasi instead of linking it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysfeat(rofi): ssh menu as a grid of host cardsDanilo M.1-2/+2
rofi's ssh mode shows the alias only. blackpearl-sshmenu.sh now reads ~/.ssh/config itself and feeds dmenu two-line cards: the alias, then "user · address" with the user only where the config sets one. ssh.rasi lays them out 4x3 under an "SSH:" header lifted out of the inputbar. The script moves into bin/ under the name hypr-theme's keybinding calls, and install.sh links it and the theme like the other menus. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07chore: waybar is gone, stop theming and reloading itDanilo M.1-28/+1
The quickshell island replaced both waybar bars and reads the palette itself, so install.sh no longer runs waybar-theme-udt's installer or signals a bar that is not running. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05fix(firefox): copy the wallpaper, Firefox won't follow the linkDanilo M.1-9/+0
The darknix.png symlink out of the profile left the new tab blank, even after a restart: Firefox's sandbox does not follow it. udt-accent now copies the wallpaper over the slot on every change instead, removing any leftover link first so the copy cannot write through it into the wallpaper. install.sh no longer makes the link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05feat(firefox): new tab background follows the wallpaperDanilo M.1-0/+9
FF Ultima selects the new tab image from a fixed list by pref. Its darknix.png slot is now a link to ~/.cache/udt/wpaper, so selecting it once in about:config makes the new tab show the current wallpaper, and Firefox picks up a change without a restart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02feat(keyboard): light the AK820 Pro in the wallpaper accentDanilo M.1-1/+1
udt-keyboard sets an Ajazz AK820 Pro to its "launch" effect in the current accent through ak820-ctl, and does nothing without it. udt-accent starts it detached on every run; --watch reapplies the accent when the USB cable is plugged in, since the keyboard takes no commands over its dongle or Bluetooth. The firmware ignores a mode change unless the lights go off first and settle, so it sends off, waits three seconds, then the mode. A lock keeps a wallpaper change and a plug-in from interleaving the pairs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30fix(install): raise the install tab only when there is something to doDanilo M.1-3/+8
The recap was handed to the steps window on every run, so the file always existed. Any later poke, such as udt-grub or udt-homepage starting from a login's wallpaper restore, reopened the window on an old summary with nothing to act on. Keep the tab only when install.sh failed or printed a command; clear it otherwise. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(palette): theme btop, Joplin and FeishinDanilo M.1-1/+1
btop gets a generated udt.theme and only the color_theme line of btop.conf is rewritten. Joplin gets userchrome.css overriding the --joplin-* custom properties most of its UI is built on, with !important since Joplin's own :root block is injected later; a userchrome.css udt did not write is left alone. Feishin 1.17 watches a Themes folder for JSON themes, so UDT.json extends its built-in Catppuccin Mocha with the scheme's roles and reaches a running Feishin live once selected. All three use existing roles, so no scheme file changes. udt-appthemes installs them next to Obsidian and Typora; the recap hint names btop and Joplin among the apps that need a restart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(install): always hand the output to the steps windowDanilo M.1-4/+19
The appearance panel is the usual way a scheme gets applied, so the hints install.sh prints belong on screen whoever calls it, not only when the panel pipes them. install.sh reruns itself as a child, tees the output to the terminal and a temporary log, and passes the log to udt-steps install, keeping the child's exit status. With the window as its main reader, the output is now a summary: only udt-palette's count line rather than all 86 generated paths, and a restart hint in place of the closing ls -l dump. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(steps): hand pending root steps to a quickshell windowDanilo M.1-9/+20
Notification balloons carried the GRUB and homepage root commands, but a balloon cannot stay open while its commands are pasted into a root shell. bin/udt-steps NAME writes a consumer's pending steps to ~/.cache/udt/steps/NAME and pokes quickshell's appearance shell, which shows one tab per file on DP-3. Empty stdin clears the tab, so producers report on every run and a consumer that caught up drops out by itself. udt-grub and udt-homepage now route through it. install.sh's SDDM block checks what is installed and reports only the steps still missing, rather than printing the full install on every run. udt-homepage remembers the last staged pair, since udt-accent now also runs on icon switches, which change neither file and would re-raise the finish steps for nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(grub): rebuild on every wallpaper change via udt-grubDanilo M.1-29/+6
GRUB's background is a wallpaper snapshot, but only install.sh rebuilt it, so a wallpaper change left the /boot copy stale with no hint. udt-grub now holds the build-and-print logic; install.sh runs it in the foreground and udt-accent starts it detached next to udt-homepage. A stale installed theme gets a notification carrying the root copy command. A flock serialises the two runs install.sh triggers, since build swaps dist/udt in by rename. AGENTS.md: udt-accent writes seven outputs (SDDM was missing), and names the two detached helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(grub): print only the root steps still neededDanilo M.1-4/+12
Up to date when the installed theme matches dist/udt, the copy line alone when GRUB_THEME already names the udt theme, the full three steps otherwise. The build is deterministic, so a clean diff -rq means nothing changed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(bin): udt-machine-name writes PRETTY_HOSTNAME to /etc/machine-infoDanilo M.1-1/+4
The GRUB theme titles its panel with the machine's pretty name, and on Slackware nothing writes /etc/machine-info: hostnamectl is systemd's. This sets the one key, keeping any others, and with no argument prints it. The value is double-quoted with only \ and " escaped, the escapes systemd's reader and the GRUB build's shlex agree on; control characters are refused. It needs root and is never run by install.sh, which only suggests it in the GRUB output while no name is set. tests/machine-name.sh checks the quoting round-trip against shlex. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29fix(grub): copy the theme from dist/udt, where the build script writes itDanilo M.1-1/+1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(grub): render grub-theme-udt's theme.txt and print its root installDanilo M.1-0/+18
theme.txt has no include, so udt-palette substitutes eight roles and the scheme name into the sibling repo's theme.txt.in, conky-style. The accent is the scheme's fixed one; nothing at boot can read the wallpaper. install.sh runs that repo's build as the user and, only when it succeeds, prints the root copy into /boot/grub/themes plus the one-time GRUB_THEME and grub-mkconfig steps. External targets are now skipped whenever their template is missing, not only when the repo is, so a sibling mid-setup cannot break an install. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29feat(install): track rofi scripts, wire nvim and hypr-theme, merge qt/gtk keysDanilo M.1-13/+98
The rofi menus' launch scripts lived loose in ~/bin, so the themes were tracked and the only things that open them were not. They now live in bin/ and are symlinked under the names hypr-theme's keybindings call. neovim gets a generated colorscheme: catppuccin/nvim with all 26 palette colours overridden from the active scheme, selected by rewriting only the colorscheme line of init.vim. hypr-theme is linked as the whole of ~/.config/hypr, leaving a real directory there alone. The qt-gtk templates were reference copies nothing installed. They now hold theme keys only and ini_merge writes them into the live qt5ct, qt6ct and gtk3 files key by key, keeping every other line; tests/ini-merge.sh checks it. The stale kvantum.kvconfig template is gone, install.sh writes that file. Fresh-machine fixes: settings.ini and ~/.config/gtk-4.0 are created when missing instead of aborting under set -e, and conky is found as a sibling checkout and skipped when absent, in udt-palette as well as install.sh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27feat(rofi): fullscreen two-button layout for the screenshot menuDanilo M.1-1/+1
The screenshot menu (Mod+Shift+S) borrowed menu.rasi, a small list box, so its two options were small glyphs in a narrow column. screenshot.rasi gives each option half the monitor on the scrim, centred vertically by spacers because rofi sizes a row by its text. rofi cannot size a font by percentage, so the calling script passes the glyph size with -theme-str, derived from the focused monitor and aware of rotated outputs; the size in the theme is only a fallback. install.sh links the new file with the other layouts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23fix: theme KDE Frameworks apps off PlasmaDanilo M.1-0/+11
kcalc rendered white under the dark Kvantum theme. Off Plasma, KStyleManager forces Breeze unless kdeglobals names a widgetStyle, and KColorSchemeManager applies BreezeLight unless kdeglobals names a colour scheme; qt6ct never forwards the portal's prefer-dark to Qt. Generate a udt.colors KColorScheme from the Kvantum roles, install it to ~/.local/share/color-schemes/, and point kdeglobals at it and at kvantum-dark. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23feat: stage the wallpaper on homepage and notify on completionDanilo M.1-16/+0
bin/udt-homepage replaces install.sh's inline scp. It stages custom.css and the current wallpaper, keeping the wallpaper's own extension, then raises a desktop notification with the root commands that install both and point settings.yaml at the new background. Plain root commands, not sudo: the login user on that host has no sudo rights. udt-accent starts it detached on every run, so it follows a wallpaper change (wallp) as well as a scheme switch (install.sh) without holding either up when the host is unreachable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23fix: write the kitty theme through its symlinkDanilo M.1-2/+5
~/.config/kitty/current-theme.conf is now a symlink into the kitty-conf repo. install -Dm644 unlinked it and left a plain file in its place, so the theme is written through the link with cat instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-19feat: theme hyprlock from the UDT palette and accentDanilo M.1-0/+13
udt-palette renders the scheme-level palette to templates/hyprlock/hyprlock-palette.conf ($panel, $input_bg, $text, $subtext, $fail); udt-accent writes the wallpaper accent gradient to ~/.cache/udt/hyprlock-border.conf as a hyprlang variable. The hyprlock config sources both, so a scheme switch recolours the lock and a wallpaper change recolours its border. install.sh copies the palette and seeds the border from the committed fallback on a fresh cache. Both selftests cover the new outputs.
2026-09-17feat: print the sddm-theme-udt root install blockDanilo M.1-0/+13
2026-09-17feat: link the conky bin dir, and restart conky silentlyDanilo M.1-1/+14
bin/ holds the weather fetch script that conky.text runs on an execi, so it needs the same symlink treatment as lib/ and widgets/. The restart now goes through hyprctl with `[workspace special:dash silent]`. The dashboard's window rule puts it on that workspace but cannot suppress the switch to it, so before this every reinstall threw the dashboard up over whatever was on screen. Guarded by a check for a running Hyprland, falling back to a plain exec elsewhere, since the workspace rule is the only reason hyprctl is involved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16fix: name the conky config explicitly on restartDanilo M.1-1/+5
The restart ran a bare `conky -d` and relied on conky's default lookup finding ~/.config/conky/conky.conf. It does resolve to the same file, so this changes nothing today. It is worth pinning anyway: the dashboard's own hypr/README.md tells the user to launch it from autostart.lua as `conky -c ~/.config/conky/conky.conf`, and two launch paths that disagree in form are how they later drift apart in effect. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16refactor: render the conky template from the dashboard repoDanilo M.1-4/+10
The Lua dashboard lives in conky-theme-udt now, so udt-palette renders that repo's conky.conf.in instead of a local template and install.sh links the Lua alongside the config. gen_conky also substitutes critical, for the dashboard's error overlay: conky reports a Lua fault as a blank window, so the dashboard catches it and draws the message instead. The old variables-and-execi template is deleted. Its hardware discovery was not lost; the hwmon glob-by-name approach is carried into lib/data.lua deliberately, since fixed indices drift across kernel reorders. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16feat(install): install the generated GTK theme as ~/.themes/udtDanilo M.1-0/+33
One fixed name for every scheme, like Kvantum: the name is referenced by gsettings and by the GTK4 symlink, so a per-scheme name would mean rewriting both on every switch and leaving stale themes behind. Only the two GTK directories are installed. The upstream theme this derives from also ships cinnamon, gnome-shell, metacity, xfwm4 and plank directories, none of which anything here reads. gtk-dark.css is written alongside gtk.css because apps request one or the other depending on the prefer-dark setting; upstream ships them identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16refactor(cache): move the generated files to ~/.cache/udtDanilo M.1-7/+15
They lived in ~/.cache/wal because pywal owned that directory and udt-accent was written alongside a pywal run. Nothing on this desktop invokes pywal any more: the wal binary is unused, and udt-accent imports pywal.backends.colorz as a quantisation library, which writes nothing. Sharing the cache only left the ownership ambiguous. colors.json is the one file that cannot move. pywalfox hardcodes <cache>/wal/colors.json and honours only XDG_CACHE_HOME, which would relocate every cache on the system, so udt-accent writes the real file to ~/.cache/udt and install.sh symlinks the old path at it. ~/.cache/wal now holds that link and nothing else. Consumers repointed here: install.sh, udt-accent, launcher.rasi's @WPAPER@. Outside the repo, wallp, Hyprland's look_and_feel.lua and quickshell's shared/Theme.qml move with it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16fix(conky): install the generated config, do not just restart conkyDanilo M.1-0/+7
install.sh generated templates/conky.conf and restarted conky, but no line ever put the file where conky reads it. git log -S"config/conky" finds nothing, so the install step never existed: ~/.config/conky/conky.conf was a hand-placed copy that happened to match while the scheme was macchiato, and silently desynced when it changed. The restart then made it worse than doing nothing, relaunching conky onto a stale config on every install. Symlinked, like everything else the repo owns, and placed before the restart because conky reads its config once at startup. Safe to link wholesale: the host-specific parts, the mpd host and the tuned ${goto} offsets in conky.text, live in conky.conf.in, so only the colours differ between schemes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16refactor(dunst): drop dunst as a consumer, quickshell presents nowDanilo M.1-14/+5
dunst no longer runs on this desktop. notifyd owns org.freedesktop.Notifications and the quickshell notifications shell draws the balloons, reading the palette from ~/.cache/wal/udt-palette.qml like every other quickshell component. So the whole dunst path was generating a config nothing read. It was also actively wrong. pywal rendered ~/.cache/wal/dunstrc from the installed template, then wal.sh restarted dunst on it while @ACCENT@ was still an unsubstituted placeholder, and udt-accent restarted it a second time after substituting. Two restarts per wallpaper change, the first on a broken config, for a daemon that could not claim the bus name anyway. Removes gen_dunst and its TARGETS entry, write_dunst and DUNSTRC, the install block, templates/dunstrc.in and the gitignore entry. The reload table now lists quickshell, which needs no signal: it watches the generated palette and re-reads it in place. The [state] roles stay. They were never dunst-only; waybar module states and conky warnings use the same four. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15fix(waybar): call the bar's installer instead of copying one fileDanilo M.1-7/+19
The palette reaches the bar as three generated files, not one: the stylesheet, dots.colors for the two dot scripts, which are bash and cannot read @define-color, and two tints of the Slackware mark, which has to contrast with the accent pill at rest and the dark pill on hover. Copying only the stylesheet meant a scheme switch recoloured every pill and left the dots and the mark on the previous scheme. Generating the other two here would have put a second writer on files the bar's own install.sh already writes, drifting apart the moment either side was edited. So this calls that script rather than reimplementing it, with UDT_PALETTE_DONE=1 so it skips the palette run this one has just done. Never fatal, like udt-appthemes: a failure there warns and leaves the bar on its old colours rather than stopping kitty, Kvantum and Sublime from being themed. Verified by switching tokyo-night to nord and back with only this script: the accent, DOT_SUCCESS and both mark tints followed in each direction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15fix(waybar): drop the per-module colours, and aim at the bar that runsDanilo M.1-8/+12
The bar these roles existed for is gone. The stock one alternated module backgrounds so it read as stripes, and carried a role for each: workspaces, temperature, memory, cpu, time, date, tray, volume, backlight, battery, plus charging. waybar-theme-udt draws every pill on main_bg, and its stylesheets reference seven names in total, none of them a module. So all eleven had no consumer left in any of the nine schemes. They are deleted rather than renamed. Renaming them after the new bar's modules would have invented consumers that do not exist: nothing reads a "mail" or "launcher" colour, because the pills are deliberately uniform. Re-adding one means a stylesheet that actually references it. install.sh was still writing the theme into ~/.config/waybar/, which hyprland no longer launches, so switching scheme recoloured a bar nobody sees while the running one kept its old palette. It writes to ~/.config/waybar-udt/ now, under the fixed name that bar imports, so there is no import to repoint. The stock directory is left exactly as it was, and deliberately gets no new theme: its stylesheets still ask for the per-module names, so writing one there would leave it referencing colours that no longer exist. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15feat(palette): add Sublime Text as a consumerDanilo M.1-0/+27
Two outputs, not one. The colour scheme themes the editor pane and tracks the wallpaper accent; the theme themes the UI chrome and sits on the scheme's fixed accent, because Sublime reads a theme once per window and a moving accent would leave open windows disagreeing with new ones. The colour scheme costs no new roles. Its scopes map onto the sixteen ANSI slots every scheme already declares, so all nine satisfy it and the identical-role-set selftest passes untouched. The theme is an override layered over Material Behave rather than a theme of its own: that theme hardcodes 419 rules of [r,g,b] literals with no variables, so the chrome surfaces are restated and its geometry, icons and animations are inherited. It installs under the name of the theme it overrides, because Sublime merges .sublime-theme files by filename with Packages/User last; under its own name it would never apply. It also has to follow Material Behave's material_theme_contrast_mode block and carry no settings gate, or contrast mode wins. The accent is replaced by matching the variable's current value rather than a placeholder: install.sh copies the file out of the repo, so after the first wallpaper change there is no placeholder left to substitute. udt-accent --selftest now covers that it stays idempotent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14fix(dunst): make the repo the real source of the dunst configDanilo M.1-0/+10
templates/dunstrc was generated and then went nowhere. dunst reads ~/.cache/wal/dunstrc, which pywal renders from its own template directory, and install.sh never wrote to either. The generated config was therefore dead, and the live one was a hand-maintained copy under ~/.config/wal/templates that this repo did not own, contradicting what AGENTS.md already claimed about dunst being a consumer. install.sh now copies the generated config into both places: the pywal template, so a later `wal` run keeps it, and the cache file, so the install reaches dunst immediately. Both retain @ACCENT@, which udt-accent substitutes in the step just below. Also bump the notification font from Noto Sans 11 to 12 for readability. Width stays at 300, so longer bodies wrap sooner rather than overflowing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LvSnbnNgdZS7YAqioCJhpT
2026-09-11feat(palette): add Obsidian and Typora as consumersDanilo M.1-0/+5
Both expose a first-class, update-safe theming hook, which is what separates them from the Electron apps that cannot be consumers: Signal, Discord and Spotify ship closed bundles whose only theming route is patching a signed asar that every update reverts. Obsidian gets a CSS snippet rather than a theme, so it layers over whatever theme a vault already uses instead of replacing the user's choice. Enabling it means appending to enabledCssSnippets in each vault's appearance.json, which bin/udt-appthemes does by reading the list and adding to it: rewriting the file would have switched off the layout snippet one vault was already using. Typora's theme is derived from the Dracula theme installed here, whose 350 rules all resolve through :root variables, so only that block is templated and none of the layout is touched. Verified across six vaults, nested ones included: the vault with an existing snippet kept it, a vault with no appearance.json got a valid one, and three consecutive installs leave exactly one udt entry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat(palette): generate the Kvantum theme so Qt apps follow the schemeDanilo M.1-0/+9
Qt and GTK were the one part of the desktop the palette never reached: Kvantum was pinned to a hand-installed catppuccin-macchiato-lavender directory, so pcmanfm-qt and every other Qt app stayed Macchiato no matter which scheme was selected. A Kvantum theme is a .kvconfig of colours and a .svg of widget artwork with colours baked into the paths, which looked like it needed redrawing. It did not: the SVG carries only 27 distinct colours, 12 of them palette colours and the rest neutral greys that are shading, not theme colour. Both files are now templates with the 12 as placeholders, derived from the theme this desktop was already running. Installs to ~/.config/Kvantum/udt/ under one fixed name for every scheme, so a switch needs no change to kvantum.kvconfig and leaves no stale theme behind. Adds accent_dim and accent_bright roles for Kvantum's hover and pressed states. Verified: no placeholders survive generation, the SVG still parses as XML, and pcmanfm-qt picks up the new colours on restart. Qt reads a theme at startup only, so running apps need restarting; AGENTS.md says so. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat(install): reload running apps after generating configsDanilo M.1-0/+26
install.sh wrote every config and reloaded nothing, so a scheme switch looked half-applied: the files were correct but waybar, kitty, conky and dunst kept drawing the old colours until five commands were run by hand. It now signals waybar, kitty and Hyprland, runs udt-accent (which regenerates the accent and restarts dunst), and restarts conky, which has no hot-reload. Each is guarded on the process actually running, so a missing one is skipped rather than started: verified conky stays stopped when it was not up before. rofi needs nothing, it reads its theme per launch. Qt and GTK apps still need a manual restart and the README says so. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat(palette): generate the homepage stylesheet and stage it on installDanilo M.1-0/+16
The dashboard's custom.css was written by hand against Macchiato, so it would have drifted the moment the desktop changed scheme. It is now generated from the same roles as everything else and staged on the host by install.sh. Adds four intermediate grey roles to every scheme. homepage wants a full ten-step ramp where the other consumers want three depths, and without them several steps collapsed onto the same colour, flattening the mid-tones. The scp is deliberately soft: five second timeout, BatchMode, a warning rather than a failure when the host is unreachable, so a laptop away from that network still installs the local theme. It stages to ~/hp-stage only, because /opt/homepage/config is root-owned; install.sh prints the sudo copy to finish. Verified: the generated Macchiato stylesheet reproduces the deployed one colour-for-colour, switching to tokyo-night propagates through to the staged file, and a failing scp leaves install.sh exiting 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat(palette): move the scheme selection out of the repoDanilo M.1-1/+6
The selector was tracked at palette/roles.conf, which made switching scheme a committable change: the previous commit carried `scheme = tokyo-night` in its diff purely because that was the theme running at the time. Which theme a machine runs is local state, not a property of the project, so the live file is now ~/.config/udt/roles.conf. install.sh seeds it from palette/roles.conf.default on a first run and never overwrites it, so a switch leaves the working tree clean and two machines sharing this repo can run different schemes. udt-palette falls back to the seed when no live file exists, so a bare checkout still generates. This is the one exception to the repo holding the canonical copy of everything, and AGENTS.md says so. Verified: seeding on a missing file, the seed not overwriting an existing choice, generation from the seed alone, and both selftests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat(palette): generate every themed config from one schemeDanilo M.1-0/+25
Colours were written down five times: rofi's palette.rasi, the waybar theme, the kitty theme, the conky and dunst templates, and a MACCHIATO dict inside udt-accent. Changing scheme meant finding all five, and they had already drifted: the active waybar theme was Macchiato while theme.css next to it was Mocha, and nothing imported the latter. Now a scheme is two files. palette/<scheme>.conf holds the colours under the scheme's own names, and palette/roles-<scheme>.conf says what each is for. palette/roles.conf is one `scheme =` line selecting the pair. bin/udt-palette renders that into each consumer's syntax and install.sh runs it first. The role map is per-scheme rather than shared because the palettes are genuinely different shapes: Nord has no `base`, Dracula no `surface0`, and forcing Catppuccin's names onto them would have meant either renaming their colours or inventing values. A role names a palette colour with two optional modifiers, `name/75` for alpha and `name*50` for brightness. The second exists because GTK's shade() has no palette name to point at. Ships macchiato, tokyo-night, nord and dracula. --selftest resolves every role in every scheme and asserts they define the same set, so a scheme that cannot satisfy a consumer fails at install rather than when someone switches to it. Verified against the live configs: all 46 waybar colours resolve identically to the previously active theme including its alpha() and shade() derivations, the kitty theme is colour-for-colour identical, and the rofi palette has the same 26 values. Generated files are gitignored; switching scheme and switching back reproduces the originals. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
2026-09-11feat: bring the power menu confirmation dialog into the themeDanilo M.1-1/+1
The yes/no gate in front of shutdown was still on the old adi1090x theme, so every shutdown showed a Macchiato power menu followed by a dialog that did not match it. Its glyphs now come from the theme's own Nerd Font rather than `feather`. That meant changing the codepoints the script sends, since the originals were Private Use Area points that only feather carries: they are now the Material circled check and close (U+F05E0, U+F0159), which Inconsolata Nerd Font Mono contains. Sized 42 to match the power menu, since the Material glyphs carry a lot of internal padding and render small. Worth knowing for future glyph choices: ClearlyU is installed and claims large parts of the Private Use Area, so it can win fontconfig's fallback and draw a blank where another font actually has the glyph. The U+F0xxx Nerd Font ranges avoid that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
2026-09-11fix: draw the power menu avatar againDanilo M.1-3/+3
Sizing the widget with an explicit width and height collapsed it, so nothing was drawn. The original type-4 theme sized it with a horizontal margin instead, letting the widget expand to the window and squeezing it back to a square, so do that. The margin is computed with calc() from 50% rather than the original's hardcoded 710px, which assumed one screen width and would sit off-center on a second monitor. The tilde path was never the problem: rofi does expand it inside a url(). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
2026-09-11fix: restore message widget, fullscreen power menu, and emoji gridDanilo M.1-1/+1
Three regressions from collapsing five theme systems into three layouts. The layouts hardcoded `children`, which silently dropped any -mesg a script passed. rofipass lost its keybinding cheatsheet and the power menu lost its uptime line. list.rasi now lists the message widget; rofi hides it when there is no message, so it costs nothing when unused. The power menu was never a small menu. It is a deliberate fullscreen prompt with a greeting, an avatar and one row of four large glyphs, and menu.rasi flattened all of it. It gets its own layout, the one place where a prompt earns its keep. The glyphs are drawn in Inconsolata Nerd Font Mono, which was verified to contain all four; the old theme asked for `feather`, which contains none of them and was relying on fallback. The emoji picker is a dense grid of glyphs, not a list, and wasted most of a single-column window. It gets grid.rasi, sized near the launcher's icons. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
2026-09-11feat: anchor the launcher top-center and add a wallpaper bannerDanilo M.1-1/+8
Matches the launcher position already in use (north-anchored, 600px, single column) rather than the centered grid, and restores the wallpaper banner behind the input area from the old darknix theme. The wallpaper path cannot be committed: rofi does not expand a tilde inside a url(), and an absolute path would bake in a home directory. So launcher.rasi carries a placeholder and the installer generates the real file. The entry sits on a solid plate so it stays legible over a bright wallpaper. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
2026-09-11feat: add symlink installerDanilo M.1-0/+28
Installs by symlink so the repo stays canonical and the working config cannot drift from it. accent.rasi is the exception: it points at the generated file in the wal cache, seeded with the committed placeholder on a fresh install. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq