• v0.9.2 a5d6d18b8f

    Shell BG: full-bleed game art with looped video + ambient drone
    release / Build Windows .zip (push) Canceled after 0s

    LastSkywalker released this 2026-05-31 09:55:24 +03:00 | 40 commits to main since this release

    Before: 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