251 Commits
Author SHA1 Message Date
a4219f8f4a Store theme backgrounds as webp (#7477)
* Decode webp in the shell

The background and the lock screen are drawn by Quickshell, so they
decode through Qt, which ships handlers for png, jpeg and gif but not
webp. QImageReader answers "Unsupported image format" and the layer
comes up blank. Any third-party theme shipping a .webp background hits
this today, even though every path that goes looking for a background
already globs the extension.

qt6-imageformats supplies the missing plugin for 71 KB downloaded. Its
one new dependency of substance, libwebp, is already on every machine
by way of libvips.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Store theme backgrounds as webp

WebP codes both of the things these backgrounds are made of better than
the formats they were in: the photographs, where its lossy mode is worth
a third or more over JPEG at matched quality, and the flat art and dot
patterns, where its lossless mode undercuts an oxipng-packed PNG.

28 of them become lossless webp and decode bit-for-bit identically
(AE=0), so the dot patterns and flat-shaded pieces carry no quality
question at all. That includes 0-launch, whose alpha channel comes
through intact. The other 51 are photographs held to the same 38 dB
PSNR floor as the JPEG pass, landing between 38.0 and 54.6 dB. Every
image keeps its exact pixel dimensions, for 29.8 MB.

Each one is encoded from the original as it stands in quattro rather
than from the file the earlier commits produced, so nothing picks up a
second generation of loss on the way here.

13 stay JPEG. WebP is plainly larger for most of them, and three are
grainy enough that its filter smooths the grain instead of coding it:
PSNR plateaus near 34 dB however high the quality goes, well under the
floor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 14:21:30 +02:00
ec779715bd Shrink theme backgrounds without touching resolution (#7266)
* Re-encode over-encoded theme backgrounds

Several backgrounds shipped at quality 95-100, which buys nothing visible
on a wallpaper but costs 20 MB. Re-encode those at quality 85, leaving
resolution untouched -- every file keeps its original pixel dimensions.

Only files stored above quality 90 are touched, and only when the result
saves at least 15% and stays above 38 dB PSNR against the original. The
34 backgrounds already stored at quality 85 or below are left alone
rather than pushed through another lossy generation for a few hundred KB.
osaka-jade/2-shaded-entrance is skipped for that reason: nothing clears
both bars. ristretto/2-coffee-beans is re-encoded at 90 instead of 85,
where 85 fell below the PSNR floor.

Theme backgrounds drop from 107 MB to 87 MB.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Store nord's night-hawks background as a palette PNG

The file uses only 8 distinct colors but was saved as truecolor RGB,
costing 1.8 MB for an image an indexed palette stores in half the space.
Converting to a palette PNG is lossless: same dimensions, and zero pixels
differ from the original.

1782 KB -> 909 KB.

The other palette-eligible PNGs are already indexed, and re-compressing
them with ImageMagick only makes them bigger, so they are left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Recompress theme PNGs losslessly with oxipng

Every background PNG was left at its authoring tool's default deflate
settings. Running oxipng over them re-packs the same pixels: all 31 files
decode bit-for-bit identically (AE=0) at unchanged resolution, for 981 KB.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Store photographic backgrounds as JPEG instead of PNG

Four backgrounds were shipped as PNG despite being photographs and
painterly illustrations, where lossless coding buys nothing the eye can
see. Re-encoding them at the same q85 used by the other backgrounds keeps
every pixel dimension and stays above 40 dB PSNR, for 3.3 MB.

The remaining PNGs stay PNG: JPEG is larger for the dot patterns and the
flat-shaded pieces, and 0-launch.png genuinely uses its alpha channel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 18:29:23 +02:00
30f7a06090 Update tokyo-night winding-road background (#7057)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 07:51:30 -04:00
David Heinemeier Hansson 9c9e082954 New launch backgrounds for Omarchy 2026-08-13 15:18:33 +02:00
David Heinemeier Hansson fa78633596 Not needed 2026-08-13 05:42:02 -07:00
David Heinemeier Hansson 0fcdd716a1 Drop backgrounds no longer worthy 2026-08-12 12:18:57 +02:00
David Heinemeier Hansson 3da9eaf61c Add quattro background by vulturetone 2026-08-12 12:18:47 +02:00
David Heinemeier Hansson 4519451655 Nostalgia for early Linux adoption 2026-08-06 16:50:10 +02:00
David Heinemeier Hansson f9bd0fd9d5 Use consistent preview 2026-07-25 11:56:39 -07:00
David Heinemeier Hansson 2fb65d0a14 Swap the default background for Lupine 2026-07-25 11:16:48 -07:00
David Heinemeier HanssonandClaude Opus 5 6cea478581 Separate Lupine's green from its yellow
Both slots held #026fde, so strings and numbers rendered in one color
and syntax highlighting lost the distinction entirely. It mattered less
when the theme shipped its own nvim and vscode files; now that both
generate from this palette, the collision is visible everywhere.

The green slot takes a violet. Lupine's hues sit at 210, 214, 224, 267
and 301, leaving one real gap between blue and magenta, and that gap is
the only place a new color fits without either crowding an existing hue
or breaking the blues-and-purples character. Its bright variant becomes
a lavender, which suits a theme named for the flower. Nothing here reads
as green; the slot keeps its ANSI name, not its usual hue.

Yellow, orange and cyan remain close to each other. Pulling those apart
means either warm hues or a wider spread than the theme allows, which is
a bigger change than this one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CC9kSQv8ZEogaxDoeKBzL
2026-07-25 10:42:15 -07:00
David Heinemeier HanssonandClaude Opus 5 4e43932c95 Redraw Lupine's omarchy wallpaper from the theme palette
The JPEG drew the wordmark in #358fff on pure white, matching neither
the accent nor the background. Every other theme's omarchy wallpaper is
a flat two-color image: the theme's background behind its accent. Lupine
now follows that, so the wallpaper, the lock screen, and the focused
window border are all one blue.

Recolored from the shared wordmark rather than redrawn, so the glyphs
land on the same pixels as every other theme. JPEG was the wrong
container for two flat colors anyway; at one bit per pixel the PNG is
2KB against 71KB, with no ringing around the letters.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CC9kSQv8ZEogaxDoeKBzL
2026-07-25 10:42:15 -07:00
David Heinemeier HanssonandClaude Opus 5 09e387a846 Cut Lupine's wallpapers to six and renumber
Drops city, lavender-bloom, dusk-horizon, purple-mountains, lake-dawn,
and snowy-dawn, then renumbers the survivors so the sequence stays
contiguous. The remaining set is uniformly pale, which is what a light
theme needs; the cut ones were mid-tone or saturated enough that the
bar and window borders lost contrast against them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CC9kSQv8ZEogaxDoeKBzL
2026-07-25 10:42:15 -07:00
David Heinemeier HanssonandClaude Opus 5 003a60b55f Generate Lupine's app themes from colors.toml
Rename the palette keys to the canonical background/foreground names the
resolver actually reads. The short bg/fg spellings were never aliased, so
every derived key was silently falling back.

Fill in the orange and brown slots too. Lupine is a deliberately cool,
near-monochrome blue palette, so both stay in family rather than
introducing warm hues the theme never had.

Drop neovim.lua and vscode.json. They pinned third-party extensions that
had to be installed separately; the generated templates cover both from
colors.toml alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CC9kSQv8ZEogaxDoeKBzL
2026-07-25 10:42:15 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 70d6f12169 Adopt Omarchy 4 theme conventions for Lupine
Convert the Lupine theme to the semantic color system introduced in the
quattro/Omarchy 4 line:

- Rewrite colors.toml from the old accent/foreground/background/color0-15
  scheme to the semantic palette (mode, bg/fg ramp, named ANSI hues, and
  bright_* variants). The chromatic palette is preserved exactly; only the
  keys are renamed.
- Replace the empty light.mode marker with mode = "light".
- Drop the hand-shipped btop.theme and chromium.theme; both are now
  generated from default/themed/*.tpl at theme-set time.

Selection now follows the convention used by the other light themes
(selection_foreground = bright_fg over a light selection background)
instead of the previous inverted dark selection bar.
2026-07-25 10:42:15 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 6e29b1416a Renumber Lupine wallpapers to contiguous zero-padded sequence 2026-07-25 10:42:15 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 4581140b8a Remove unused wallpapers from Lupine theme 2026-07-25 10:42:14 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 4a2a228de0 Add 10 more light wallpapers to Lupine theme 2026-07-25 10:42:14 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 60393e8269 Remove twilight-sky wallpaper from Lupine theme 2026-07-25 10:42:14 -07:00
Bjarne ØverliandDavid Heinemeier Hansson c828149045 Add lavender and pastel sky wallpapers to Lupine theme 2026-07-25 10:42:14 -07:00
Bjarne ØverliandDavid Heinemeier Hansson 1008776ddf Add Lupine theme 2026-07-25 10:42:14 -07:00
David Heinemeier HanssonandClaude Opus 5 5cd753b206 Give Solitude and Last Horizon their own unlock screens
Solitude had no unlock assets at all, so it fell back to the default
Plymouth logo. Last Horizon shipped a preview-unlock.png derived from
Nord's that still carried Nord's navy #2e3440 entry-box fill; only the
background and logo had been recolored.

Both are now generated the way the rest of the set was: the logo mask
recolored to the theme's accent, and the preview rendered by the same
pipeline as `omarchy plymouth preview` using each theme's background
and foreground. Last Horizon's unlock.png was already correct and is
untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CC9kSQv8ZEogaxDoeKBzL
2026-07-25 08:39:50 -07:00
David Heinemeier HanssonandClaude Opus 5 f8e4f4d4fb Remove leftover waybar theme files
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-24 12:20:52 -07:00
David Heinemeier HanssonandClaude Fable 5 503388b4d6 Retune opacity for Hyprland 0.56's corrected alpha premultiplication
Hyprland 0.56 fixed premultiplication in the color-management shader
(hyprwm/Hyprland#14403), so the same opacity values now render visibly
more transparent than on 0.55. Raise each value to its perceptual
equivalent (a^(1/2.2)) to restore the previous look.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:22:16 -07:00
David Heinemeier HanssonandClaude Fable 5 f4a7b30366 Retune opacity for Hyprland 0.56's corrected alpha premultiplication
Hyprland 0.56 fixed premultiplication in the color-management shader
(hyprwm/Hyprland#14403), so the same opacity values now render visibly
more transparent than on 0.55. Raise each value to its perceptual
equivalent (a^(1/2.2)) to restore the previous look.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:15:47 -07:00
David Heinemeier Hansson 324fd387c0 Convert two more themes that are a good fit to be generic 2026-07-19 19:07:07 -07:00
David Heinemeier HanssonandClaude Fable 5 4cbe47c14d Generate ristretto neovim/vscode configs from the colorset too
The colorset is the Monokai Pro Ristretto palette, so the generated
themes keep all the accent colors. Brightened muted to Monokai Pro's
actual comment color, since comments sit on that key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 19:07:07 -07:00
David Heinemeier HanssonandClaude Fable 5 81217e5749 Generate vantablack neovim/vscode/btop configs from the colorset too
Tuned muted, dark_foreground, and lighter_background to the tiers the
explicit themes used, which also fixes muted falling back to pure white
in the generated terminal configs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 18:43:04 -07:00
David Heinemeier Hansson 3f2f2dd245 Can now generate these configs just from the expanded colorset 2026-07-19 18:37:25 -07:00
David Heinemeier HanssonandClaude Fable 5 afa2839a5a Rename bg/fg palette keys to background/foreground
The canonical colors.toml keys are now background/foreground, including
all permutations (dark_background, darker_background, lighter_background,
dark_foreground, light_foreground, bright_foreground). The old short
names are gone entirely, not kept as aliases; legacy alacritty-generated
themes still resolve through the ANSI color0/color7 fallback.

Theme files are also regrouped: accent/selection/muted first, then the
backgrounds, then the foregrounds, then the named colors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 16:24:51 -07:00
David Heinemeier Hansson 4823e05c00 Make the highlight more subtle
And stick with the same gaps setup as all other themes
2026-06-21 15:02:49 +02:00
Ryan Hughes 221fb296fc Simplify theme palette tokens 2026-06-11 02:08:02 -04:00
David Heinemeier Hansson 79470dde92 Refine shell panel and lock theming 2026-06-03 22:14:48 +02:00
David Heinemeier Hansson 3cdfb52a74 Didn't actually like the stock hyprland active color
Especially not on the notifications or lock screen
2026-06-03 21:05:19 +02:00
Ryan Hughes 53357ace61 Rename purple theme color to magenta 2026-06-02 20:39:36 -04:00
Bjarne ØverliandRyan Hughes b1505a085d Implement semantic theme color system 2026-06-02 17:23:28 -04:00
Ryan Hughes 98ba4a9697 Bring on gradient borders 2026-06-02 11:17:13 -04:00
Ryan Hughes 9c4ff68a43 Restore themed Hyprland gradients 2026-06-01 17:37:24 -04:00
David Heinemeier Hansson ff2a418a25 Use correct highlight for kanagawa 2026-05-27 13:34:39 +02:00
David Heinemeier Hansson e36ba09d02 Updated btop theme for solitude theme by HANCORE 2026-05-21 09:55:14 +02:00
David Heinemeier Hansson 7ea4e1ab04 Switch hyprlock to QS 2026-05-19 17:08:14 +02:00
David Heinemeier Hansson f2815a8601 Theme feels wrong without round corners 2026-05-16 22:38:33 +02:00
ManuelandDavid Heinemeier Hansson 14ddd6ee85 Fix gradient border syntax in last-horizon and solitude themes (#5869) 2026-05-16 22:20:38 +02:00
David Heinemeier Hansson 1eab0cffc9 Integrate swaybg and swayosd into the new shell 2026-05-16 20:34:09 +02:00
David Heinemeier Hansson fc271c1406 Merge branch 'dev' into omarchy-shell 2026-05-16 12:58:57 +02:00
AbdullohandGitHub adeba8aa95 Convert last-horizon and solitude themes from hyprlang to Lua (#5867) 2026-05-16 09:37:15 +02:00
Ryan Hughes f404a81c6a Consolidate omarchy-shell colors into a single shell.toml surface
Five plugins each owned their own colors.toml watcher with subtly
different parsers, plus two ad-hoc per-theme override files
(notifications.json, image-picker-colors.json). This collapses all of
that into one source of truth: Commons/Color.qml watches colors.toml +
shell.toml and exposes Color.bar.*, Color.popups.*, Color.notifications.*,
Color.menu.*, Color.imagePicker.* for every surface to bind to.

shell.toml is generated by the existing template pipeline from
default/themed/shell.toml.tpl. Themes can ship their own shell.toml to
override individual keys; everything missing falls back to the
foundational palette via root.pick(). Settings panel is intentionally
not themable beyond the foundational tokens.

last-horizon and solitude ship a minimal shell.toml to preserve their
historical 'notification border matches Hyprland active border'
behavior, which previously came from parsing the theme's hyprland.conf
(now removed).
2026-05-16 00:30:27 -04:00
David Heinemeier Hansson 84de3d3a2e Extract more helpers 2026-05-14 12:51:03 +02:00
Ryan Hughes 59a2619426 Update theme specifics to lua 2026-05-11 10:39:22 -04:00
David Heinemeier Hansson e099f47d53 Add toggling of hyprland window rounded corners 2026-05-10 11:31:02 +02:00