Goal
Make artwork appear immediately and consistently without compromising IPFS-backed content addressing.
Problem
The upload API currently accepts multi-megabyte original covers and pins them unchanged. The UI reuses those assets across hero, rooms, stage rail, player, and catalog surfaces. Gateway fallback occurs only after an image error; a slow gateway may stall without failing.
Scope
- Transform cover uploads server-side with
sharp or equivalent.
- Produce a tiny placeholder plus 64, 160, 320, and 640 px AVIF/WebP variants.
- Extend the release manifest/read model with responsive cover refs and intrinsic dimensions.
- Use
srcset, sizes, decoding="async", fixed aspect ratios, and lazy loading outside the hero.
- Use
fetchpriority="high" only for the active hero/player artwork.
- Add gateway timeout/racing and remember the winning gateway per CID/session.
- Put an immutable caching edge/read-through gateway in front of IPFS where allowed.
- Preserve the original cover as an archival asset, not the default UI asset.
Performance budgets
- Hero cover p75 < 1 s cold on mobile 4G.
- Catalog thumbnail transfer target < 40 KB each.
- Zero layout shift caused by artwork.
- Broken/slow gateway recovery < 1.2 s before trying the next source.
Acceptance criteria
- Newly uploaded releases have responsive image variants.
- Existing releases degrade to generated aura placeholders while legacy covers load.
- Repeated surfaces do not independently download full-size originals.
- Cache headers are immutable by CID.
- Browser tests cover slow, failed, and CORS-rejected gateways.
Goal
Make artwork appear immediately and consistently without compromising IPFS-backed content addressing.
Problem
The upload API currently accepts multi-megabyte original covers and pins them unchanged. The UI reuses those assets across hero, rooms, stage rail, player, and catalog surfaces. Gateway fallback occurs only after an image error; a slow gateway may stall without failing.
Scope
sharpor equivalent.srcset,sizes,decoding="async", fixed aspect ratios, and lazy loading outside the hero.fetchpriority="high"only for the active hero/player artwork.Performance budgets
Acceptance criteria