RECORDGOD/app
type-two e8013a4633 feat(shop): DECKS — two-channel preview mixer on release pages (Serato internal-mode vibe)
Pure Web Audio, zero deps (site/decks.js, self-contained UI):
- deck A/B with waveform (client-computed peaks), click-to-seek, play/pause, CUE
- ±8% varispeed pitch (playbackRate — turntable behaviour, deliberately no keylock)
- channel gains + equal-power crossfader, DynamicsCompressor master limiter
- AudioContext lazily created on first load (autoplay policy safe)

Sources:
- local preview MP3s: PREVIEWS_DIR (default ./previews, gitignored) served at
  /previews, discovered via GET /shop/local-previews/{release_id}
  ({release_id}.mp3 / {release_id}-*.mp3|.m4a); on prod bind-mount the collection
- Apple 30s previews: GET /shop/preview-proxy?u= (STRICT whitelist
  *.itunes.apple.com / *.mzstatic.com) — Apple CDN sends no CORS, Web Audio needs it
- YouTube/Beatport/Bandcamp embeds untouched: iframes can never enter a mixer

release.html: A/B load buttons per track preview + local-cut rows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 22:57:47 +10:00
..
__init__.py feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
admin_routes.py feat(sku): canonical 14-digit timestamp SKUs so RFID/EPC tagging works (new items) 2026-07-05 03:34:27 +10:00
auth_routes.py feat(auth): staff email+password login + password reset (login stays token-based under the hood) 2026-06-26 16:24:34 +10:00
auth.py feat(auth): staff email+password login + password reset (login stays token-based under the hood) 2026-06-26 16:24:34 +10:00
collections_routes.py feat(collections): interactive editor — click-map crate select, genre/style/price/year rules, live match stats, priority 2026-06-22 21:33:15 +10:00
db.py feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
dealgod.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
disc_images.py feat(intake): ScanGod bridge — POST /admin/intake/scan (photo→staged product) + reply 2026-06-24 17:16:18 +10:00
discogs_mp.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
intake_routes.py feat(intake): condition dropdown auto-fills suggested price 2026-06-30 18:40:06 +10:00
layout_routes.py security(layout): SSRF guard on /layout/import-brand (reject internal hosts, no redirects) 2026-07-05 02:49:09 +10:00
mailer.py feat(pos): rebuild Sales — 3 tabs, smooth checkout + tender/change, print+email receipts 2026-06-23 16:29:42 +10:00
main.py feat(shop): DECKS — two-channel preview mixer on release pages (Serato internal-mode vibe) 2026-07-06 22:57:47 +10:00
mirror.py feat: self-contained enrichment — disc_cache (own catalog copy), no external DB dependency 2026-06-21 13:16:56 +10:00
navigator_routes.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
packs.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
payments.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
receipts.py feat(pos): receipt logo + Monster Robot template (store name/address/footer) 2026-06-23 17:33:08 +10:00
sales_routes.py money: atomic stock claims, amount validation, discount gate (converge with StoreGod twin) 2026-07-05 03:02:30 +10:00
settings_routes.py feat(connect): OpenRouter key + test in vault; AI agent integration plan 2026-06-24 16:12:19 +10:00
shop_routes.py feat(shop): DECKS — two-channel preview mixer on release pages (Serato internal-mode vibe) 2026-07-06 22:57:47 +10:00
square.py feat(pos): Square Terminal payments — push checkout to a paired terminal 2026-06-23 17:57:26 +10:00
urlguard.py security(layout): SSRF guard on /layout/import-brand (reject internal hosts, no redirects) 2026-07-05 02:49:09 +10:00
vault.py feat: standalone RecordGod web UI — landing, control-room dash, encrypted secrets vault 2026-06-21 12:40:07 +10:00
virtual.py feat(3d): crate-type + rack logo decals on object faces; verified bin slope 2026-06-27 12:33:30 +10:00
wowplatter_v1.py feat(intake): wowplatter/v1 intake carries est_market_value (DealGod target from PRICEGOD) 2026-06-25 02:00:40 +10:00