PlayMusic Backlog Snapshot

Cross-repo undelivered work · last updated 2026-04-29 · shipped items verified against git log since 2026-04-15
Blocking Active / next up Planned Research Shipped (verified vs. git)
0
Shipped (verified)
0
Active or next up
0
Planned
0
Research / undecided

PlayMusic — Product Strategy

Optimised for learning & velocity · in support of End-of-Q2 Go Live

Distribution

Across partners — multiple channels surface real behavioural patterns and clean A/B comparison.

Content depth

Game content depth for users to engage with — enough surface area to see what sticks.

Technology

Tech that lets a small team run and iterate at speed — CMS, LiveOps, deploy panel as the operational backbone.

This baselines and iterates on: engagement habits (music & game affinity, sessions, session length), channel effectiveness (impressions, sessions), sentiment (D1/D7/D14 retention around creation & gameplay), and ops model at scale (deployments, games, portals, uptime).

Iteration Matrix

How the three focus areas unlock Go Live
Learning goal Distribution Content Technology
Engagement habits Multiple channels = real behavioural patterns ~10 modes × ~20 environments = enough surface to see what sticks Live analytics captures it cleanly
Channel effectiveness Y8 + Playgama + Discord gives genuine comparison Same content across channels = clean A/B Graduated rollout lets us test without risk
Sentiment (creation & gameplay) Channel mix surfaces different audience reactions Diverse modes isolate creation vs. play-loop signal Song-to-game pipeline is the thing being judged
Ops model More partners = more ops surface to stress-test More content = more throughput demands on pipeline CMS + LiveOps + deploy panel — we'll see where they break

Production Status

Live now → Mid May → End of Q2 (Go Live)
Live NowAs of 2026-04-29
Technology
  • Song-to-game pipeline live
  • Engine in production, embedded across internal and external channels
  • CMS with full pipeline control, asset management, and deploy panel
  • Graduated deployments for maximum uptime
  • Google and Discord sign-in
  • Live analytics
  • LiveOps model in place — reduced engineering reliance
  • Quick user generation
Game Content
  • 5 game modes shipped: rhythm, drift, platformer, flight, shooter
  • 15 environments live
Distribution
  • Fully remote control of content globally
Mid MayNext milestone
Technology — live
  • Discord Activities — use the service without leaving Discord
  • Multiplayer (H2H + Duet co-op) merge to staging — full system already built on feature/multiplayer: Cloudflare Workers relay, Durable Objects rooms, ghost renderer, lobby manager, spectator camera, customization (ghost color, opacity, emotes). Currently gated to Music Runner + Duet for testing
Game Content
  • +2 templates
  • +2 environments live
Distribution
  • Improved global load times
End of Q2Go Live launch
Technology — platform maturity
  • Multiplayer hardening — scale to 2–4 person rooms across all modes (foundation already on feature/multiplayer; Mid-May ships Music Runner + Duet, Q2 expands the rest)
  • Tournaments & competitions engine
  • CRM in place — closes the loop between analytics and lifecycle communication
  • Advanced game-generation flow
Game Content — 10 modes, double today's depth
  • 3 new modes shipped (10 in total)
  • Multiplayer enabled across all modes (H2H + co-op)
  • Tournament / competition formats
Distribution — 4 partner channels live
  • Partner-curated content
  • Channel-specific competitions and content
Two-day release window: Apr 22-23 + Apr 29. Babylon engine consolidation, AI chart review, and a major production push covering portal attribution, share metrics, security hardening, and partner experience.

Apr 22-23 · Babylon engine consolidation + AI chart review

Engine + chart pipeline

Live Babylon engine + per-game config.json everywhere

Finished migrating every game-load path to use the live Babylon engine + per-game config.json. Removed the last legacy "baked HTML export" code paths from the consumer frontend, CMS, and the play API.

Portal import populates engine config

Portal imports now correctly populate game titles and song metadata in the engine config.

AI chart review hardening

Added robustness to the AI-driven chart review pipeline: handles truncated Gemini responses, configurable model, 16K token limit, robust JSON parsing for double-encoded responses.

Apr 29 · Major production push

Portal attribution · share metrics · security hardening

Portal attribution end-to-end

Every game session played from a partner portal (Playgama, Discord, Y8, etc.) now records which portal it came from. Spans the engine, consumer frontend, and backend; backed by a new game_sessions.portal_id column. Critical for partner reporting and revenue attribution.

Wizard song analytics

When a user picks a song, navigates the wizard, and creates a game, we now track impressions, clicks, and "song builds" — feeding the LiveOps Songs leaderboard for editorial decisions ("which songs should we refresh?").

Share metrics fix

Share funnel had been silently broken since March — frontend was firing one event name and backend was looking for another. Fixed; share metrics will populate from now on.

Tween-friendly share menu

Dropped X/Twitter, added Messages (iMessage/SMS), reordered for tween-relevance. Native Discord share works for connected users.

Rich link previews

Share links pasted into Discord/Slack/iMessage/Twitter now unfurl as rich cards with the game thumbnail, title, and description. Previously rendered as a generic placeholder.

Music integration semantics fix

A pipeline-vs-engine vocabulary mismatch ("drop" / "break" / "breaker" weren't valid engine values) was causing audio to drop out and never recover on some songs. Both the publish path and the engine's runtime are now defensive.

Admin security hardening

All /api/admin/* endpoints now require ADMIN-role authentication at the router level. Removed two shared-secret backdoor endpoints that were guarded only by a hardcoded string in the codebase.

Playgama partner experience

New CDN-cached path for engine assets (immutable headers); portal D1 sync respects curated CMS data instead of overwriting; tab-pause/resume on the game modal; vehicle-URL safety fix to prevent cross-mode contamination.

Quick Builder cross-link

CMS sidebar's Quick Builder now opens the consumer-app /create flow on the matching environment.

Two artist games shipped

First content showcase pieces — proof points for the song-to-game pipeline

Boujee Baby (Kendrick) — Drift mode

New environment (NYC streetscape, taller buildings, highway signs, custom sky), rigged character riding a Taxi Drift vehicle, organic camera pull-back, custom collectibles (flowers + trash), uniform Office wall with 8-color variety, denser lamps, full song-spaced gameplay tuning. Demonstrates the pipeline producing a polished one-of-one experience for a specific artist.

It Takes A Village (Canyon) — Platformer mode

New canyon environment with 3-height collectibles, double-jump + extended hang-time, "no game-over" forgiving mode, rolling wheels, diamond collectibles, song progress bar, always-on tutorial, results-screen polish. Audio unmute fix shipped alongside. Shows platformer mode now ready to host artist content, not just abstract levels.

Why these matter

Both are end-to-end proof that the song → concept art → 3D → game pipeline can deliver branded artist experiences. They also surfaced and forced fixes on real edge cases (vehicle wheel preservation, character swapping, audio fallback, void-damage modes) that now harden the engine for everyone.

Multiplayer — built and gated for testing

Live on feature/multiplayer branch · Mid-May merge target
What we'd previously listed as "Q2 / 3-6 month build" turned out to be substantially shipped. The full real-time multiplayer system is feature-complete on a branch and being load-tested with limited modes before staging merge.

Real-time relay infrastructure

Cloudflare Workers relay with Durable Objects GameRoom per match. WebSocket hibernation recovery so a worker restart doesn't drop in-flight games. 30Hz tick rate with smooth client-side interpolation between state ticks. Production relay URL wired up in the harness.

H2H (head-to-head)

Full ghost renderer with synced jump, slide, and celebration animations; lane sync; vertical-curve following on hills; postMessage integration with parent frame; dedicated MultiplayerHUD; H2H results screen.

Duet co-op mode

Stem-builder co-op where two players cooperatively trigger stems. Synced stem state, host config sharing on room join, dedicated co-op results screen.

Lobby + spectator system

Lobby with countdown, ready button gated on config load, room-state config persistence in Durable Object storage. Spectator camera + spectator lobby — anyone can watch live multiplayer matches without joining.

Customization

Ghost color picker, opacity slider, emote system, room settings panel, host toggles for ghost/score display. Player avatars with speed multiplier. Auto-removal of stale ghosts.

Currently gated

Modes restricted to Music Runner + Duet during testing. Flight and Drift disabled in MP for now — they'll come online as physics-sync mode matures. Mid-May ships the gated set; Q2 expands across all 10 modes.

Discord Activity — foundation laid

Targeting Mid-May ship — embedding + attribution groundwork in place

Frame-ancestors + trusted origins for partner embedding

CSP frame-ancestors updated to allow Y8, Playgama, GamePix, and localhost. Portal-shell can be embedded in y8.com iframes without breaking. Same plumbing extends to Discord Activity iframe at launch.

Portal attribution end-to-end

Game sessions now record portal_id at the engine level — Phase 1 (engine sessions) and Phase 2 (frontend + backend regex matching) both shipped. When Discord Activity goes live, it'll plug into the same attribution pipeline with no additional work.

Embed-mode UX

Login button hidden in /e/ embed routes. Recording.js skipped in portal/embed contexts. Tab-pause/resume on the game modal. Cumulatively this is the embed UX Discord Activity will use.

What's left for Mid-May launch

Discord Activity SDK integration, Discord OAuth scopes, lobby/voice channel awareness, and submission to Discord's developer portal. Underlying iframe + attribution + embed UX is already production-tested via Y8 / Playgama traffic.

What broke (and was fixed) during the push

Three in-flight issues, all resolved within minutes of detection
Production migrations workflow had a hardcoded list that hadn't been updated for migrations 044-048. Caused session-start endpoint to error briefly until we appended the missing migrations.
Admin auth lockdown silently broke 19 CMS pages whose fetch calls didn't carry session cookies. Patched (credentials: 'include').
First Playgama portal promote landed with broken state — project links missing, engine URL pointing at staging. Promotion-service hotfix shipped, idempotent re-run healed all 7 games.

Why it matters

Partner reporting unlocked

We can now answer "how many sessions came from Playgama vs Y8 vs Discord this week?" and start setting payouts/billing on accurate data.

Editorial signal restored

Share metrics + song engagement tracking surface "which songs are popular" — informs content refresh decisions.

First-impression upgrade

Rich link previews when users share games make Tweets, Discord posts, and iMessages noticeably more attractive to click. Compounds organic share growth.

Security posture

Admin endpoints are now properly gated. Two shared-secret backdoors removed.

Outstanding for next week

→ Connect the new asset CDN handler to actual engine traffic (currently dormant infrastructure).
→ Backfill creator attribution on Playgama games.
→ Pull baseline share metrics for analysis before next iteration.
→ Resolve a few latent data anomalies (one song with a bad audio path on staging).

Ranked by ROI — impact ÷ effort

Re-sorted to surface the highest-leverage work first: small efforts with outsized impact at the top, large bets where the impact justifies the spend further down. Effort and impact are subjective 1–5 scores; ROI = Impact × 2 − Effort (so small / high-impact items lead).

EffortS = days · M = 1-2 weeks · L = month+
Impact — combined Perf / Creator-User / Ops weight
ROI — high-leverage shipping order, not raw importance

Top 10 by ROI

Highest leverage first · effort ↓ + impact ↑
1
Auto-sync D1 on publish
CMS "Sync to Edge" still requires a click. Auto-fire on publish action. Removes manual step + recurring "did you sync?" support burden. ~1 day of work.
Impact: 4/5Effort: SWhy now: daily friction, trivial fix
S Ops Creator
2
Production deploy parity (pool / instances / PgBouncer)
Staging values validated by load test. Production workflow still on old values — risk: prod can't absorb 5K CCU. Just a workflow YAML diff applied to deploy-microservices-production.yml.
Impact: 5/5Effort: SWhy now: protects Go-Live capacity
S Perf Ops
3
Asset catalog production sync
Staging 4,628 → production 1,428 assets. Bulk D1 sync to bring prod creator catalog to parity. Likely a script invocation + verification, not net-new code.
Impact: 4/5Effort: SWhy now: unblocks pipeline at prod scale
S Creator Ops
4
Sentry on consumer-frontend
@sentry/react + error boundaries. We have product analytics (LiveOps) but no error tracking for prod traffic. Blind spots cost minutes during incidents. Grafana stack can come later — Sentry alone delivers 80% of the value.
Impact: 4/5Effort: SWhy now: incident response is currently flying blind
S Ops
5
Merge multiplayer (H2H + Duet) to staging
Branch feature-complete: Cloudflare Workers relay, Durable Objects, ghost renderer, lobby, customization. Largest single user-facing differentiator on the calendar. Effort is the merge + soak test, not the build.
Impact: 5/5Effort: MWhy now: bulk of work already done
M User Ops
6
Concept Art CMS Screen
Backend complete (6 DALL-E images, 8 personas, per-asset upload/regen/3D). Need React screen with gallery + variation cards + selection. Unlocks daily creator workflow for every song. Effort is mostly UI plumbing.
Impact: 5/5Effort: MWhy now: blocked creators on a daily basis
M Creator
7
Per-song asset slots + curated style dropdown
Configurable JSONB slots replace hardcoded 9-slot pipeline. ~12 vetted art styles in dropdown. Internal creator ask — directly enables the next 50+ artist games. Touches both pipeline + CMS.
Impact: 4/5Effort: MWhy now: internal-team unblocked, multiplies output
M Creator
8
Read replica wiring + activation
get_read_connection() already exists in game-pipeline + asset-service. Provision Cloud SQL read replica + flip to use it. Largest remaining single perf lever for backend reads. Falls back to primary so it's safe.
Impact: 4/5Effort: MWhy now: code already laid, infra is the only step
M Perf
9
Discord Activity launch (Mid-May)
Foundation laid (frame-ancestors, attribution, embed UX). Remaining: SDK integration, OAuth scopes, voice/lobby awareness, Developer Portal submission. Unlocks 4th distribution channel — but Discord SDK + review cycle is real work.
Impact: 4/5Effort: MWhy now: on the calendar already
M User
10
Tournaments engine
Docs/briefs landed (engine plan, system design, leaderboard integration). Schema + CMS + consumer UI not yet built. Largest piece of the Q2 Go-Live target — high impact but a multi-week build, so ROI sits below the quick wins.
Impact: 5/5Effort: LWhy now: Q2 gate, but plan first to avoid sprawl
L User Ops

By pillar — open work breakdown

Items unique to each axis (cross-cutting items are in the Top 10 above)

⚡ Performance

Read replica wiringWire get_read_connection() to provisioned Cloud SQL replica. Falls back to primary safely.
Engine bundle size auditTree-shake unused Babylon modules; measure current size. Engine-side.
Asset progressive loadRender scene before all GLBs are ready, swap in as they arrive. Engine-side.
/api/config/modes edge cache~620ms first-load. Cache at edge.
R2 multi-regionAll buckets WEUR today. US/APAC for latency. Research.
Guest sessions → stateless JWTsEliminates last Cloud SQL hot-path write for unauthenticated users.

👤 External user / creator

Concept Art CMS ScreenReact screen with gallery + variation cards (backend ready).
Per-song asset slots + art-style dropdownConfigurable slots; curated style catalog.
Personas viewer pageStandalone /personas with scope toggles for profile + asset use.
Alchemy creator UX polishGLB lazy-load + pagination on character grid (port already shipped).
CMS nav restructurePlan in cms-nav-restructure-plan.md.
Stale chunk error boundaryReact boundary that auto-reloads on lazy-route chunk failure.
Share Experience planScore-share with replay link, highlight clips, challenge invites, OG images.
TikTok video capture flowPlan in video-capture-tiktok-plan.md. Not started.
CrazyGames SDK integrationSubmit at least one game.
Native app (Capacitor) Phase 0-1PWA basics → Capacitor shell + Apple Sign-In + store submission.
Apple Sign-In frontend wiringBackend configured; required for App Store.
AAC fallback for SafariEngine OGG → m4a fallback. ~30 lines.

⚙️ Ops

Production pool / PgBouncer / max-instances parityStaging values validated by load test; prod still on old config.
Auto-sync D1 on publishRemoves manual "Sync to Edge" click.
Asset catalog production sync4,628 staging → 1,428 prod assets. Bulk sync.
Sentry on consumer-frontendError tracking + boundaries.
Prometheus + Grafana CloudUnified dashboards.
PostgresManager dedup~7 services have copies; move to shared.
psycopg2 → psycopg3 conversion~10 files, mechanical translation.
WizardPipelineManagerV2 dedupSingle source of truth across services.
Monolith deploy fallbackHard-fail or remove dead-monolith fallback in staging workflow.
SuperTokens production instanceProd still hits staging SuperTokens; needs dedicated instance.
R2 multi-region(also under Perf — ops cost angle)
Husk package deletionRemove deprecated babylon-game-engine, playmusic-game-sdk, r3f-game-engine dirs.
Filter Active 0 Planned 0 Research 0 Shipped 0 Reset

PlayMusicHack

~/Projects/PlayMusicHack/docs/backlog/

Backend Microservices

Tech debt, latent bugs, performance follow-ups across the 7 microservices.

Tech debt

  • 🟢
    psycopg2 → psycopg3 conversion — ~10 files in player-api + media-service still import psycopg2 at module level. Mechanical 1:1 translation.
  • 🟢
    PostgresManager duplicated across 7+ services — each has its own infra/postgres_manager.py copy. Move to shared module.
  • 🟢
    WizardPipelineManagerV2 duplicated — exists in portal-cms, game-pipeline, asset-service, celery-worker. Single source of truth needed.
  • 🟢
    D1 game sync is manual — CMS "Sync to Edge" must be clicked after publish. Should auto-sync.
  • 🟢
    Docker layer cache serves stale shared codebackend/shared/ changes may not propagate due to GHA cache.
  • 🟢
    Game categories inconsistent — DB has old categories (runner, rhythm) for migrated games; consumer app has new (endless, music, drift).
  • 🟢
    Monolith deploy fallback — staging workflow silently falls back to dead playmusic-backend-staging if a service URL fetch fails. Hard-fail or remove.

Latent bugs (April audit)

  • TIME_UPDATE log spam in GameModalV2 — handler added.verified
  • 🟡
    start_session non-UUID insert — accepts "dev-test" as guest_id; psycopg rejects. Validate or 400.
  • 🟡
    get_leaderboard route ordering — static /leaderboard/creators matched by parameterized route. Reorder.
  • 🟢
    Transient psycopg connection drops — Cloud SQL cuts idle connections; pool doesn't pre-ping.
  • 🟢
    asset-service OOM on 512 MiB — bump to 1Gi or profile leak.

Performance follow-ups (load test 2026-04-21)

  • 🟢
    Read replica wiringget_read_connection() exists but isn't called yet. Provision Cloud SQL replica + wire up.
  • 🟢
    Production deploy parity — pool size, PgBouncer config, max-instances bumps from staging.
  • Upstash Redis activation — leaderboard + likes instant reads/writes at scale.6047ef48
  • PgBouncer sidecar permanent in staging — load test fixes including DB pool sizing and edge caching.9ceb43b4
  • 🟢
    Guest sessions → stateless JWTs — eliminates last Cloud SQL hot-path write for unauthenticated users.

Production cutover

  • 🟢
    game-pipeline service extraction — still partial.
  • 🟢
    engine-api service stabilization — works but flagged unstable.
  • 🟢
    /api/games/purge-cache route missing on prod gateway — add nginx route.
  • 🟢
    Production SuperTokens instance — production still hits staging SuperTokens. Need dedicated instance + DB.

CMS & Creator Tools

Concept art, Alchemy port, share/recording, promote-to-prod. CMS lives in frontend/.

Concept art & creative direction

  • 🟡
    Concept Art CMS Screen — backend complete (6 DALL-E images, 8 persona variations). Need React screen: gallery, variation cards, selection, reference upload.
  • Per-asset upload/replace — replace concept art image in R2 from CMS.0441947a
  • Per-asset prompt regen — show full prompt + extra direction field, regenerate single asset via gpt-image-1.193aa754
  • Per-asset 3D from concept — Meshy I2D button per concept image.d90cb0f5

Alchemy UI port

  • 🟢
    Port Alchemy to React — engine packages/alchemy/consumer-frontend/src/pages/Create.jsx. Replace hardcoded defs with catalog API.
  • 🟢
    /create route — split-panel: engine iframe left, song/mode/character pickers right. Replaces multi-step wizard.

Share & recording

  • 🟢
    Share Experience plan — full plan in docs/share-experience-plan.md. Not started.
  • 🟢
    Recording engine port — Babylon recording.js sourced from backend/game-server/static/, manually synced. Make engine repo canonical.
  • 🟢
    /play/:gameId GameModalV2 wrap — currently bare EngineFrame. Should wrap in full GameModalV2 (likes, leaderboard, share).

Promote to Production

  • Promote to Production CMS feature — batch select songs/games/portals from CMS.5cfa3b4f
  • Promotion service hardening — engine URL rewrite, project_id relink, cascades, schema fixes.7c5b5ee7
  • E2E promote flow — first Playgama portal promote landed (with hotfixes); 7 games healed via idempotent re-run.7c5b5ee7

Other CMS gaps

  • 🟢
    Asset Library Tool — standalone /asset-library.html with semantic search across 4,000+ catalog assets.
  • 🟢
    CMS nav restructure — plan in docs/cms-nav-restructure-plan.md.
  • 🟢
    Stale chunk error boundary — lazy-loaded routes fail after deploys. Auto-reload on chunk failure.
  • 🟢
    Wizard preview env reset bug — after handleConfirm, mode-init effect re-fires with default neonArcade. Visual only.

Song-to-Game Pipeline

Internal-user requests for the song → concept art → 3D → game flow.

Per-song asset slots (drives concept art + 3D)

  • 🟢
    Configurable slot system — replace hardcoded 9 concept art slots + character/obstacle/collectible workers with per-song JSONB concept_art_slots config. Each slot: {id, type, label, generate_concept, generate_3d, art_style?, rigged?}.
  • 🟢
    Slots panel in CMS — UI to add/remove/rename slots before generation. Defaults to current 9.
  • 🟢
    Engine config compat — slot ids → engine roles. Decision pending: keep canonical filenames or remap in config builder.
  • 🟢
    Migration — new column on songs, default = current 9-slot config.

Curated art-style dropdown

  • 🟢
    Style catalog — ~12 styles vetted against gpt-image-1 + Meshy lowpoly: anime, western cartoon, comic book, Studio Ghibli, cel-shaded, low-poly stylized, claymation, synthwave, noir, watercolor (2D-only), pixel art (2D-only).
  • 🟢
    Per-song default + per-slot override — song profile gets art_style field. Regen modal exposes per-asset override.
  • 🟢
    Prompt injection — fragments slot into existing prompt builders.
  • 🟢
    Style verification batch — generation run across all 12 to confirm Meshy-safe flag is correct.

Personas viewer (standalone CMS page)

  • 🟢
    /personas page — list all 8 hardcoded personas with name, age range, description, system prompt. Read-only v1.
  • 🟢
    Two scope toggles per persona — "Use for song profiles" + "Use for asset generation".
  • 🟢
    Persistence decision pending — move 8 personas into personas table, or keep hardcoded + side table for scope toggles.

Multiplayer

  • Real-time multiplayer foundation — Cloudflare Workers relay, Durable Objects GameRoom, WebSocket hibernation recovery, 30Hz tick.c2f3f806d442cc
  • H2H (head-to-head) gameplay — ghost renderer, lobby, postMessage integration, MultiplayerHUD, results screen.abb0361661c802
  • Duet co-op mode — stem builder co-op with synced state and dedicated results screen.bd94019a7dd79f
  • Spectator camera + lobby — watch live multiplayer matches.cfd2d697f2ce35
  • Multiplayer customization — ghost color, opacity, emotes, room settings, host toggles.24df3d6
  • 🟡
    Merge feature/multiplayer to staging — branch is feature-complete; gated to Music Runner + Duet during testing. Mid-May ship.
  • 🟢
    Expand multiplayer to all modes — flight + drift currently disabled in MP; Q2 target enables across all 10 modes.
  • 🟢
    Score challenges (async ghost share) — share link "beat my 12,000" using existing ghost replay infra.

Tournaments

  • 🔵
    Tournament definition — schema needed: tournament, entry, leaderboard scope, prize, time window. New CMS page to manage.
  • 🔵
    Time-bounded leaderboard scope — D1 leaderboard infra exists; needs tournament_id filter.
  • 🔵
    Tournament UI on consumer — entry, current standings, countdown, results.
  • 🔵
    Reward / prize plumbing — out of scope until tournament v1 ships.

Deeper sharing

  • 🟢
    Score-share with replay link — share link includes recorded session for ghost playback.
  • 🟢
    Highlight clip share — auto-generate clip of best moment for TikTok/Discord.
  • 🟢
    Challenge invite — share-with-target to specific friend, results aggregated server-side.
  • 🟢
    Embed share image — OG image with score, song, character thumbnail. Pre-rendered server-side.

Integrations

TikTok, Discord, CrazyGames, native (Capacitor), Apple Sign-In.

TikTok

  • 🟡
    Profile "Connect" gating — not gated on VITE_ENABLE_TIKTOK_SIGNIN. Auth sign-in is gated; profile connect button always shows.
  • 🟢
    TikTok video capture flow — full plan in docs/video-capture-tiktok-plan.md. Not started.

Discord

  • 🟢
    Discord Activity (game-in-Discord) — full plan in docs/discord-activity-integration.md. Not started.

CrazyGames

  • 🟢
    CrazyGames SDK integration — slash command exists for export prep. Not yet wired into publish flow. Submit at least one game.

Native app (Capacitor)

  • 🟢
    Phase 0 (1-2 wk): PWA basics — manifest, service worker, installable.
  • 🟢
    Phase 1 (4-6 wk): Capacitor shell, Apple + Google Sign-In, store submission.
  • 🟢
    Phase 2 (4-6 wk): Push notifications, offline caching (~500MB), native share, score challenges.
  • 🟢
    Phase 3 (8-12 wk): IAP, ghost replays, Babylon Native prototype.

Apple Sign-In + Luminate

  • 🟢
    Apple Sign-In frontend wiring — backend already configured. Required for App Store submission.
  • 🔵
    Luminate music data — backlog in docs/luminate-backlog.md. Decide before scoping.

Infrastructure

Deploy panel, blue/green, perf, observability, D1, R2.

Deploy

  • Deploy panel + Force Deploy + maintenance page — non-dev control panel with branded maintenance/404 toggle.b1fff58dde771703
  • Canary preview routing + fallback — auto-set cookie + 404 fallback to stable.98d679c4c04801ad
  • Graduated rollout (production) — production canary live; backends graduate to 100% before gateway+frontend.441aaaa0
  • 🔵
    Blue/green deployment — ~$320/mo extra. Revisit if canary doesn't stabilize.

D1 / edge

  • Auto-sync D1 on cache purge — published games sync to D1 edge automatically.9a619716
  • 🟢
    Asset catalog prod sync — staging has 4,628 assets, production has 1,428. Bulk D1 sync.
  • 🟢
    Thumbnail URL cleanup — production games reference staging API URLs. Migrate to CDN.
  • 🟢
    /api/config/modes edge cache — ~620ms first load. Cache at edge.

Performance & storage

  • Engine iframe load time — engine-side optimizations + immutable CDN headers + redundant audio load skip.ca7058a
  • R2 jurisdiction cleanup — switched to default endpoint for WEUR buckets, removed dual-client routing.5921d3b9a9a6a088
  • 🔵
    R2 multi-region — all WEUR today. US/APAC for latency.
  • 🟢
    Thumbnail storage unification — pipeline bucket → assets bucket + CDN URLs in D1.
  • 🟢
    Read replica provisioning — Cloud SQL replica + wire get_read_connection().

Observability

  • 🟢
    Sentry on consumer-frontend — error boundaries, error tracking.
  • 🟢
    Prometheus + Grafana Cloud — unified dashboards.
  • LiveOps on production — hybrid PostgreSQL + BigQuery analytics live, dynamic source badges, Creation tab.4e6e5d0ea0b9fcf7
  • Migration 042 (analytics_events) — ran on prod via 044-048 hotfix workflow.0ba4065d

Other

  • Remove Godot prefetch — D1 game feed + project detail return Babylon engine URL; wizard prefetches Babylon engine, not Godot.5b4790442e145c07698c581d
  • 🟢
    Delete husk packagesbabylon-game-engine/, playmusic-game-sdk/, r3f-game-engine/ are deprecated.

Open Bugs (April snapshot)

Production / staging bugs not yet fixed.

Production

  • TikTok "Connect" shows on production Profile — gating fixed.verified
  • Game likes refreshing in GameModalV2 — Upstash Redis + D1 edge writes resolved sync issues.6047ef4803b22e3b
  • /api/games/purge-cache on prod gateway — D1 sync side-effect cleaned up.38672324

Catalog / preview

  • Wizard preview env reset to neonArcade — fixed.verified
  • Catalog vehicle/ship thumbnails — generation + upload run, R2 backfilled.verified
  • Catalog vehicle orientation auto-correct (engine-side) — runtime fix for Y-up oriented vehicle models.f81195c
  • Drift vehicle wheel preservation + swap — VehicleController preserves GLB hierarchy and shared modelCache.098ac55de310b7

Mobile / dev experience

  • Director mobile touch input — override select-none for inputs to enable touch.6320356
  • TIME_UPDATE log spam — handler added (or throttled engine-side).verified
  • 🟢
    Stale chunk errors after deploy — lazy-loaded routes fail. Need React error boundary that auto-reloads.

Babylon Game Engine

~/Projects/playmusic-game-engine/docs/backlog/

Engine Runtime

Performance, audio, retargeting, iframe protocol, catalog assets.

Performance

  • Iframe load time — engine-side optimizations + immutable CDN headers + redundant audio load skip.ca7058a
  • Engine debug logging[STATE] / [gameLoop] console logs stripped before production.verified
  • 🟢
    Bundle size audit — measure current Babylon + game code; tree-shake unused modules.
  • 🟢
    Asset progressive load — load scene before all GLBs are ready, swap in as they arrive.

Audio

  • 🟢
    AAC (.m4a) fallback for Safari — full plan in AAC_FALLBACK_PLAN.md. ~30 lines new code.

Iframe protocol bugs

  • TIME_UPDATE log spam — resolved on PMH side.verified
  • SET_VEHICLE_MODEL swap fix — route to DriftMode's VehicleController; reparent meshes correctly.33c980ab617443
  • Director mobile touch input — override select-none on inputs.6320356

Retargeting / animations

  • Runtime animation retargeting — fallback verified; library skeleton kept alive, minimal retarget options for same-convention skeletons.3a38c5637fbfe5
  • 🟢
    Babylon.js v8 upgrade — required for AnimatorAvatar retargeting (CHR-03, ANIM-02, ANIM-03).
  • 🔵
    Babylon.js v9 upgrade — supersedes v8 work. WebGPU defaults, IBL improvements, NME updates. Likely batch with v8 (skip straight to v9).
  • 🟢
    Shared animation library — Quaternius UAL packaged into anims-core.glb, etc. on R2. Eliminates per-song animation gen.

Catalog assets

  • Vehicle orientation auto-correct — runtime fix in engine for Y-up oriented vehicle models.f81195c
  • 🟢
    Engine player model API unification — 3 URL fields + 3 SET actions. Long-term: unify into one.

Engine Tools

Standalone tools (Alchemy, Director, Harness, Asset Library, Anim Harness).

Alchemy (creator)

  • Port to React in PMH — Alchemy creator rewritten as React, connected to catalog API.verified
  • 🟢
    GLB lazy-load + pagination — character grid currently loads all at once.

Director Studio

  • 🟢
    Director Studio UI — full plan in DIRECTOR_STUDIO_PLAN.md. Standalone page with timeline + cue editor + VFX/audio/scene panels.
  • Director touch handling — mobile touch input enabled for inputs.6320356

Harness — embedded Scene Editor

  • Slot editor + asset browser in harness (v0) — first cut shipped 2026-04-20.1daf5c4
  • 🟢
    Embed full Babylon Scene Editor — beyond slot editor: drag-place props, edit lights/cameras, materials. Save scene back to game config. Likely iframe or panel inside packages/harness/.
  • 🟢
    Scene → config serialization — Scene Editor writes .babylon/glTF; serializer maps editor entities → our slot/spawn/entity model.
  • 🟢
    Asset library bridge — Scene Editor pulls props/characters from catalog instead of file uploads. Custom asset browser panel.

QA Harness, Asset Library, Anim Harness

  • 🟢
    QA tools panel — full spec in QA-TOOLS-PLAN.md. 11 tool categories.
  • 🟢
    Standalone /asset-library.html — browse all catalog assets, filter by type/style/pack, semantic search, 3D preview.
  • 🟢
    /anim-harness.html — load any character GLB + animation library, test retargeting. Blocked on Babylon v8/v9.

Husk packages

  • 🟢
    Delete packages/babylon-game-engine/ — deprecated split.
  • 🟢
    Delete packages/playmusic-game-sdk/ — split to separate repo.
  • 🟢
    Delete packages/r3f-game-engine/ — deprecated.

Engine Bridges

postMessage protocol, recording, multiplayer hooks, native, CrazyGames.

Iframe / postMessage protocol

  • 🟢
    TIME_UPDATE handler / throttle — see runtime section.
  • 🟢
    Bridge API docPlayMusicBridge.ts has 3 player-model URL fields + 3 SET actions. Document and unify.

Recording

  • 🟡
    recording.js source-of-truth — currently in PMH, manually synced into engine. Make engine repo canonical.

Multiplayer & sharing hooks

  • Real-time multiplayer surface — Durable Objects WebSocket relay, ghost renderer, lobby, customization.feature/multiplayer
  • 🟢
    Score-challenge async embed — accept ?challenge=<replay_id>, fetch ghost data, render semi-transparent player. Reuses real-time ghost infra.
  • 🟢
    Highlight clip detection — engine emits "best moment" event for share clip extraction.
  • 🟢
    Pre-rendered OG image — server-side OG image; engine just provides screenshot endpoint.

Native & CrazyGames

  • 🔵
    Babylon Native viability — currently blocked by no Web Audio API support.
  • 🟢
    CrazyGames SDK ad hooks — engine emits "level start"/"level end"/"rewarded ad opportunity" events.