What changed in v3
The big shift is replacing the old Node.js backend with a Go daemon: one process owns gallery state, playlist scheduling, image processing, and backend orchestration. It exposes a chi HTTP router on the socket, a Cobra CLI, a pub/sub event bus wired to SSE (/events), and pluggable Go backend packages. Storage is CloverDB.
Backend surface — Apply + capabilities
Backends now expose a single Apply entrypoint with declared Capabilities; the legacy WallpaperRequest / TryBatchRestore paths are gone. Auto mode reads capabilities per media type. See daemon/internal/backend/README.md in the repo for the current contract — that file is the source of truth for adding a new setter.
Design system pass
The UI got a tokens + density sweep. Highlights:
- UI Scale setting (
compact/default/comfortable/large) — scales the renderer, sidebar rail, and icons. Lives in Settings → General → Theme & Appearance. See The app — Settings. - Font scale tokens + muted text tokens (
--wp-text-muted,--wp-text-faint) — replaced ad-hocopacity-60/70sweeps. <Kbd>primitive for keyboard hints (used in Looper and Shader studios).- Neobrutalist radius slider wired to
--wp-radius-*tokens; gallery cards and sidebar respect it. - Image details sidebar — redesigned: tighter type scale, restructured metadata, palette swatch delete, sticky footer.
- Settings modal — density pass: token sweep, dropped dead
xl:ramps, lighter header weight.
Wallhaven route
The in-app Wallhaven browser is now closer to feature parity with the gallery:
- Resolution-match badge per result (exact / good / poor vs. largest monitor).
- NSFW blur toggle (
config.wallhaven.blur_nsfw_thumbnails) — unblurs on hover. - Ratio filter chips, color filter swatch picker.
- Hide downloaded toggle to skip wallpapers already in the gallery.
- Set popover on cards (per-monitor set), inline download and playlist menu icons.
- Clickable tags in the detail modal — click to seed a new search.
- Selection bar + back-to-top in long result sets.
- Detail modal scales to viewport and uses the full-resolution image, not the 600px thumb.
See The app — Wallhaven.
Contrast audit
pnpm run audit:contrast (script: scripts/audit-contrast.mjs, uses culori) checks token contrast pairs across themes. Output is audit-contrast.json at the repo root. Useful when adding a theme or shifting muted-text tokens.
Migration assumptions
If you are carrying notes from older versions, treat the API contract on GitHub and OpenAPI as the current surface; the daemon’s routes.go on GitHub is the final word on which paths exist.
