-
Shell BG: full-bleed game art with looped video + ambient drone
release / Build Windows .zip (push) Canceled after 0sreleased this
2026-05-31 09:55:24 +03:00 | 40 commits to main since this releaseBefore: the shell background was a fixed deep-purple gradient with
three drifting blobs. Pretty, but every game looked the same. Felt
cheap next to PS5 / Apple TV / Steam Big Picture, where the front
page screams the highlighted game through full-bleed art.Now the active carousel tile's hero art fills the whole screen,
animated when SteamGridDB has a looped clip for it:Backend:
- domain.Game gains VideoPath; games.video_path column added via
idempotent extraColumns retrofit (existing DBs upgrade in place). - UpsertGame / gameSelectCols / scanGame / UpdateGameCovers carry
it. - meta.fetch() now returns (cover, hero, icon, video). For
Steam-ID-known games it queries SGDB heroes/steam/?types=
animated; for name-matched, heroes/game/?types=animated. The
first asset (webm/mp4) is downloaded via the existing
content-keyed tryDownload so re-runs are a no-op. - EnrichAll's "already complete" gate widened to require video too,
so existing rows get their clip on the next enrich pass. - guessExt handles webm/mp4.
Frontend (ShellBackground):
- Three-tier render:
- Image stays mounted underneath the video until 'playing' fires,
so we never flash a black frame while the webm is parsing. - Overlay tuned WAY lighter (vertical black/15 -> black/55 + soft
corner vignette) so the art actually reads through. Bottom edge
stays dark enough for the carousel plate. - HeroPanel lost its own duplicated
(BG owns the art now);
kept a local left-side gradient so the title text reads against
busy heroes.
Ambient drone (sound.ts):
- Procedural Web Audio pad, no asset files (per the frontend rule).
Three sine oscillators at A2/E3/G3 -> low-pass at 900 Hz -> master
gain capped at 0.012 with a 0.07 Hz LFO for breathing. Quiet
enough that you only notice when it stops. - Lifecycle: starts on first user gesture (AudioContext autoplay
gate), then visibilitychange handles suspend/resume. Stops on
document.hidden (game launched / window minimised) and when the
user picks Sound: Off in Settings. 1.5 s fade-out so it doesn't
pop.
ADR: .claude/decisions/0024-shell-bg-art-video-and-ambient-drone.md.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Downloads
- domain.Game gains VideoPath; games.video_path column added via