| Age | Commit message (Collapse) | Author | Files | Lines |
|
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>
|
|
The conky dashboard target is an absolute path now that it lives in
another repo, and `out_dir / absolute` discards out_dir, a documented
pathlib behaviour.
For the default in-repo render that is correct: the file genuinely
belongs at that path. For a render aimed anywhere else it is not.
selftest renders every scheme to a temp dir to have rofi parse the
result, so the escaping target rewrote the live file each time,
silently leaving the user's rendered conky.conf set to whichever scheme
was probed last rather than the one they run. Confirmed with a sentinel
line: before the fix it vanished after a selftest, after it survives.
So an absolute target is honoured only when out_dir is the repo, and
rebased under out_dir otherwise. Rebasing unconditionally was the wrong
fix and was caught in testing: it sent the real render into a
home/danix/... tree inside this repo and stopped updating the live file
at all.
Verified both directions: selftest leaves the live file alone and
creates no stray tree, a real render still updates it, and all nine
schemes still pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
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>
|
|
The README said derived tints were left alone, which was true for an hour and
is now wrong for twelve of them. Records which widget each paints, what it
became, and why shade() keeps the relationship rather than the upstream value.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Twelve hexes were shades upstream computed from a palette colour rather than
taking one. They were left literal on the same reasoning as the neutral greys,
which was wrong: a grey is shading, but each of these paints one widget
surface in a colour that is supposed to be the theme's. Under any scheme but
Macchiato they stayed Macchiato, including the window close, minimise and
maximise hover fills.
They are substituted as @ROLE_PCT@ now, the percentage being that shade's
brightness relative to its base. shade() scales each channel and clamps, so it
keeps the relationship rather than the exact upstream value; closest on the
accent family, crudest on the reds, where upstream darkened toward saturation.
GTK4 carries ten of the twelve: the selected progress bar and the
selection-mode titlebar backdrop are GTK3-only widgets upstream.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
AGENTS.md listed GTK3/GTK4 among the covered consumers, but nothing generated
or installed a theme for it: the claim had been aspirational since the repo
started. It now describes what the code does, and says plainly that the old
state was a gap rather than a drift.
templates/qt-gtk/ documented both Qt and GTK as installed from upstream. Qt
still derives from catppuccin/Kvantum and GTK from catppuccin/gtk, but both
are generated here now, so the table and the gsettings line say 'udt'. Its
tracked gtk3-settings.ini carried the old theme name too, which made the
record disagree with the live config it mirrors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
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>
|
|
A placeholder with no matching role renders literally into the CSS and GTK
drops the declaration without an error. The stylesheets are 8500 lines each,
so nothing would catch it by eye.
Verified the assertion fires: renaming @ACCENT@ to @NOSUCHROLE@ in one asset
template fails the selftest, naming the file and the placeholder.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
70 new targets: the two stylesheets, the metatheme descriptor and 67 widget
assets. The assets are discovered from disk rather than listed, because they
arrive as a set from upstream and a hand-written list would miss one added by
a future refresh.
Substitution does the _RGB@ form before the bare @ROLE@: @FG@ is a prefix of
@FG_RGB@, so the other order would eat the start of the triple placeholder
and leave a literal "_RGB@" in the CSS.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
67 SVGs carrying only three palette colours: bg, bg_alt and the accent, the
last in 36 of them. The upstream gtk-3.0 and gtk-4.0 asset directories are
byte-identical, so one templated set is rendered and copied into both.
index.theme names the theme in three places and has no placeholders; it is a
template only so it installs through the same code path. Its icon and cursor
entries are this desktop's, not upstream's Tela-circle-Dark and
Macchiato-cursors, which nothing here uses.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Derived from catppuccin/gtk v1.0.3. Substitution is whole-file rather than
confined to the @define-color block at the tail: 338 palette hexes in GTK3
and 328 in GTK4 sit in the 8400 lines above it, so a block-scoped template
would have left most of the theme macchiato.
Both colour forms are replaced, the hex and the bare decimal triple GTK
writes inside rgba(). Neutral greys, upstream's derived tints and the
Material swatch constants are left exactly as drawn, the same rule the
Kvantum SVG follows.
#eff1f5 is upstream's foreground, which is Latte text: a near-white it pairs
with a Macchiato background. It maps to the fg role so GTK text matches rofi,
kitty and waybar rather than being brighter than all of them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK's stylesheets write colours two ways: as a hex, and as a bare decimal
triple inside rgba(). The existing rgba() helper emits without spaces and
wraps the call itself, so neither form matches what the upstream theme
contains; rgb_triple emits just `r, g, b` and the template keeps the call.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK4 uses an orange for weather chart fills and badge backgrounds, and no
role exposed one. Every scheme defines it or --selftest fails, which is what
that identical-role-set check is for.
Catppuccin schemes name it peach; tokyo-night, dracula and the three material
schemes call it orange; nord calls it aurora_orange.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK was listed in AGENTS.md as a covered consumer but nothing generated or
installed a theme for it. Every GTK app sat on a hardcoded upstream
catppuccin-macchiato-lavender while the rest of the desktop ran tokyo-night.
The plan templates the upstream stylesheets and assets the way Kvantum
already is, rendering into ~/.themes/udt under one fixed name per scheme.
Substitution is whole-file rather than confined to the @define-color block:
338 palette hexes in GTK3 and 328 in GTK4 sit outside it, which was measured
before the approach was chosen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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
|
|
All three are written by udt-palette and rewritten by every install, so
each scheme switch showed them as modified. dunstrc and conky.conf were
already in .gitignore and tracked anyway, which does nothing: the ignore
list is not consulted for files already in the index. homepage's
custom.css was missing from the list entirely.
Add the missing entry and drop all three from the index. AGENTS.md
already documents them as generated and gitignored, so this makes the
repo match what it says.
Verified all three regenerate from an absent file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176XsV85ByN2ee7HseUKcqA
|
|
styles/main.css and styles/global.css are edited in place, not generated,
and reference nineteen colours by Catppuccin name: @surface1, @text,
@crust, @lavender and the rest. gen_waybar emitted only the role layer
plus the scheme's own palette names, which happen to include those names
under the four Catppuccin schemes and none of the other five.
Under tokyo-night every one of those references was undefined, GTK fell
back to a default, and the separators in main.css went from a dim
alpha(@surface1, 0.4) hairline to full brightness. The workspace
underline, the bluetooth, mail and breaktimer state colours and the
tooltip border were falling back the same way.
Emit them from roles, reusing the ROFI_NAMES table that exists because
rofi had this exact bug; mauve is the one name waybar uses that rofi
does not, and maps to the highlight role.
Verified across all nine schemes: every referenced name now resolves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176XsV85ByN2ee7HseUKcqA
|
|
The installer found vaults by scanning ~/Documents/Obsidian for .obsidian
directories, which cannot tell a vault from a leftover. That parent folder
holds an abandoned .obsidian from a vault that no longer exists, so the scan
found six vaults where Obsidian knows five, and the extra one got a snippet
and an edited appearance.json for something Obsidian never opens.
It now reads ~/.config/obsidian/obsidian.json, which is the list Obsidian
itself maintains, and only writes to a path that is both registered and still
has a .obsidian directory.
The stray directory has been restored to its previous contents.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
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
|
|
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
|
|
Adds Catppuccin Frappe and Mocha, which share Macchiato's colour names so
their role maps are the same mapping against different values, and Material
Ocean, Palenight and Darker, which bring their own names and their own maps.
Nine schemes now, all dark.
Material ships one accent per hue and three greys where the roles want five
depths, so each Material palette carries four interpolated shades, marked as
not upstream, and its bright_* terminal slots name the same colours as the
normal ones.
The selftest now renders every scheme to a temp directory and has rofi parse
every theme, not just check that roles resolve. Resolving was never the
property that mattered: the Tokyo Night breakage resolved fine and still
emitted a palette the themes could not use. Verified the check fails when a
name is removed.
Catppuccin Latte is deliberately absent. It is light, and that is not a role
remap: homepage is pinned theme: dark and the generated card overrides target
its dark-mode class.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
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
|
|
Switching to tokyo-night broke every rofi launcher. The themes reference
Catppuccin spellings (@base, @text, @surface0), and gen_rofi emitted whatever
names the scheme happened to use, so under Tokyo Night the palette defined bg
and fg instead and rofi refused to parse a theme referencing colours that did
not exist.
The names the themes ask for are now filled from roles, the same way every
other consumer already worked. The spellings stay Catppuccin's because that is
what the themes were written against; only the values change per scheme.
Adds a selftest that collects every @name used in a colour property across the
themes and asserts the generator emits it. Verified it fails when a name is
removed, rather than passing vacuously, and all seven themes now parse under
all four schemes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
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
|
|
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
|
|
Two things still assumed Catppuccin. The QML header hardcoded "Catppuccin
Macchiato" regardless of the scheme in use, and the selftest asserted that an
orange input snaps to a colour named "peach", which is true only under
Catppuccin: Tokyo Night calls that hue "orange" and the test failed the moment
the scheme changed.
The header now names the scheme it generated from. The snapping assertions
test the property instead of the spelling: an input must land within 0.6 rad
of its own hue, and a border neighbour must sit nearer the accent than its
opposite. Both hold under any palette.
Verified: --selftest passes under macchiato, tokyo-night, nord and dracula.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
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
|
|
colors.json recorded whatever path it was handed, so it read either the real
wallpaper or ~/.cache/wal/wpaper, the symlink to it, depending on the caller.
wallp passes the resolved file; a manual run usually passes the symlink. Same
wallpaper either way, so record one spelling.
write_atomic arrived with the quickshell palette but only write_border used
it. The other four writers kept their own copy of the same write-then-rename,
which is the duplication the helper was added to remove, so they use it now.
No behaviour change: the temp file was already created by mkstemp in every
case, so the resulting modes are the same.
Verified by running the script before and after: udt-palette.qml,
udt-accent.rasi and udt-border.lua are byte-identical, and colors.json differs
only in the wallpaper field this commit intends to change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
udt-accent now writes ~/.cache/wal/udt-palette.qml alongside the accent,
border and colors.json it already produced. Quickshell components read it
and watch it, so editing the palette here recolours a running shell
without restarting it.
Unlike the other outputs this one is not only the accent: it carries the
structural colours too. Those are parsed out of rofi/udt/palette.rasi
rather than restated in the script, so that file stays the single place
the Macchiato values are written down. Hardcoding them a second time
here is exactly the drift this is meant to remove: the quickshell
components each had their own copy before this.
The atomic write that write_border already did by hand is now a helper,
write_atomic, used by both. Every generated file is watched by something,
and a torn read shows up as a theme that briefly loses its colours.
colors.json is untouched by this change, verified by running the script
before and after and comparing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
|
|
It configured clipmenu, the X11 clipboard manager .xprofile started. cliphist
through rofi replaced it, so the export had nothing left to configure.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
An X11 leftover nothing reads under Wayland. Nothing sources it, and every
program it started is either not running or started elsewhere now (dunst,
by udt-accent). Backed up to /data/udt-backup/xprofile.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
The GPG PIN dialog was the last unthemed Qt6 app. pinentry-qt links Qt6
despite the name, but gpg-agent is spawned from .bashrc and reparented to
init, so it never inherits the QT_QPA_PLATFORMTHEME that Hyprland sets for
its own children, and every pinentry it spawns fell back to Fusion.
Also restructures the document: it was headed "phase 1 (rofi)" and now
covers more than rofi, so the phase is a section rather than the title.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
udt-accent now rewrites ~/.cache/wal/colors.json as a fixed Catppuccin
Macchiato palette with the wallpaper's accent in the cursor and the two
highlight slots, then runs `pywalfox update`.
colors.json is the only file pywalfox reads, so this is the only way Firefox
can follow the accent. Overwriting it wholesale costs nothing: wallp already
rewrote it moments earlier via `wal --theme`, and nothing else consumes it.
kitty reads its own current-theme.conf, so the terminal palette is unaffected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
|
|
Records what cost real time to discover: that rofi's -dump-theme normalises
values and cannot tell you what renders, that measuring screenshot pixels beats
reasoning about the box model, that GTK3's theme comes from gsettings rather
than settings.ini on Wayland, that ClearlyU shadows Private Use Area glyphs in
fontconfig fallback, and why accent extraction must not go through wal -i.
CLAUDE.md is a thin pointer at it, matching the user's global convention.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
13.0 to 15.0, the same correction waybar needed after the same font change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Brings the terminal onto the same monospace font as the rest of the desktop.
The live setting is inside the BEGIN_KITTY_FONTS block managed by kitty's font
kitten; a stale commented-out font_family line above it was removed, since it
looked authoritative but had no effect.
Size left at 13.0. Inconsolata reads slightly smaller than CommitMono at the
same nominal size, the same difference that needed a 2px bump in waybar.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
These were deliberately left until last: wallpaper-derived colours in kitty's
ANSI slots were the original readability problem, since nothing in a wallpaper
guarantees color4 stays legible against color0. A hand-tuned palette is safe for
the opposite reason, so the move is onto Macchiato rather than back onto pywal.
current-theme.conf was a symlink into the wal cache and is now a real file.
wal.sh no longer recreates that symlink, which would have silently reverted the
theme on the next wallpaper change.
Neovim read the same pywal output via colorscheme pywal and now uses the
catppuccin/nvim plugin. Its airline theme was base16_dracula, matching nothing;
it is now base16, which derives from the active colorscheme.
Measured before committing: every ANSI slot clears 4.5:1 against its own
background in both themes except color0, which is the near-background slot in
both. color8, used by some colourschemes for comments, does drop from 3.83:1 to
2.38:1, but the Catppuccin neovim plugin sets its own comment colour rather than
using ANSI 8, confirmed on screen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Inconsolata renders smaller than Commit Mono at the same nominal size, so
matching the number made the bar read smaller than before. Every size in
fonts.css goes up by 2px. Both ends of the bar still fit without truncation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Waybar was already Catppuccin Macchiato with a lavender accent, using the same
hex values as the rofi palette, so only the font needed changing: it asked for
Commit Mono Nerd Font, a third family outside the Noto Sans and Inconsolata
pair. Monospace is kept deliberately, since a status bar is dense and numeric
and proportional text makes values jitter as they update.
Also records that the CSS load order in waybar's own CLAUDE.md is stale. The
modules-*.css and states.css files it documents are not imported by anything;
style.css pulls in styles/main.css instead. One of the dead files holds a
font-family declaration that looks authoritative but has no effect.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Installs the upstream Catppuccin Kvantum and GTK themes and points all four
toolkits at them. Qt5 and Qt6 previously disagreed with each other as well as
with the desktop: qt5ct carried a hand-rolled grey/purple palette and qt6ct used
the stock darker.conf. Both now take their palette from Kvantum.
Two things were not where they looked. GTK3's theme comes from gsettings on
Wayland, not settings.ini, and gsettings was pinned to Breeze, which silently
overrode the file; its icon-theme was likewise on breeze-dark while
settings.ini said Material-Black-Plum-Suru. GTK4 ignores gtk-theme-name
entirely, so its stylesheet is symlinked into ~/.config/gtk-4.0 instead.
The accent is fixed rather than wallpaper-tracking, since Qt and GTK apps only
reread a theme on restart. Lavender also replaces mauve as udt-accent's
fallback so everything without a wallpaper-derived accent agrees.
catppuccin/gtk is archived upstream. v1.0.3 works today but will not track
future libadwaita changes; it is removable by deleting the directory.
The tracked qt5ct/qt6ct files carry only the theme-relevant keys: the live
files also hold an ignored_applications list of local paths.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Only the seven colour definitions in conky.config changed. The conky.text
block is byte-identical: its layout is column-based on absolute ${goto} pixel
offsets, so touching label widths or glyphs would need every goto on that line
re-tuned.
Mapping keeps each colour's role and its light/dark relationship, so the widget
reads the same: headings and glyphs to lavender, field labels to teal, accent
glyphs to mauve, separators to surface1, values to text.
Conky does not hot-reload, so this needs a restart to take effect.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Notifications previously drew their colours from the pywal preset, so they were
pure black on white and did not match anything else. Structural colours are now
fixed Macchiato, with the accent as the frame on normal urgency, a muted
surface frame on low, and Macchiato red on critical. Font moves to Noto Sans to
match the rest of the desktop.
udt-accent substitutes the accent after pywal renders the template, then
restarts dunst so it rereads the file. It restarts rather than just killing:
nothing else respawns dunst, and a dead dunst means no notifications at all.
Also fixes a dangling reference: the template pointed dunst's dmenu at
darknix/main.rasi, a theme that no longer exists.
The template is tracked here as templates/dunstrc; the live copy is
~/.config/wal/templates/dunstrc.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Replaces the six-stop RGB rainbow with the current accent plus its two
neighbours on the perceptual hue wheel. The borderangle animation rotates a
gradient, so it needs more than one colour to show motion; neighbouring hues
keep that motion legible without leaving the palette.
Emitted as Lua rather than a .conf snippet. Hyprland's Lua parser refuses
hyprctl keyword ("keyword can't work with non-legacy parsers") and has no
source directive, so look_and_feel.lua reads the generated table with dofile()
and falls back to a fixed Macchiato triple when it is absent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|
|
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6aeE37K4GHBsaM51yLTTq
|