Skip to content

docs: Static Buffet 2.0 modernization PRD#7

Merged
drftstatic merged 1 commit into
mainfrom
claude/vj-modernization-review-a14bcf
Jul 19, 2026
Merged

docs: Static Buffet 2.0 modernization PRD#7
drftstatic merged 1 commit into
mainfrom
claude/vj-modernization-review-a14bcf

Conversation

@drftstatic

Copy link
Copy Markdown
Owner

What

Adds PRD.md — a full product requirements document for modernizing Static Buffet from its current state ("feels like 2003") to a 2026-grade browser VJ instrument. Docs only; no code changes.

Why

The current app's dated feel has three architectural root causes, all evidenced in the doc with file:line references:

  1. No rendering engine — effects are CSS filter strings on an HTML5 <video>; the queue's "crossfade" field is exported but never actually performed (no A/B mixing exists).
  2. Desktop-windowing UI — floating/dockable/resizable panels as the primary workspace.
  3. Customization as product — 10 themes, 7 TTS soundboards, 3 onboarding flows, layout demonstrators, and 13 npm dependencies imported nowhere.

The PRD distills research across the 2026 VJ landscape (Resolume 7.27, VDMX6, Synesthesia, Noisedeck, LumaDeck, Radiance, ISF, Hydra/Butterchurn; ~60 sources in Appendix B) into a phased plan:

  • Phase 0 — Demolition: cut ~10k LOC and ~25 deps (explicit cut list with estimates)
  • Phase 1 — Engine: WebGL2 two-deck compositor, curated ISF effects (one intensity knob each), feedback/trails pass, beat clock with quantized triggering, captureStream output + set recording
  • Phase 2 — Instrument: MIDI learn, cue points, chop, set bundles, scene morphing
  • Phase 3 — Amplifiers: AI text-to-set curation over the Archive.org corpus

Reviewer notes

  • Read §6 (cut list) and §9 (risks) closest — the theme deletions and the Postgres-as-cache removal are the most opinionated calls.
  • Performance budgets in §7 are framed as requirements, not aspirations; push back there if targets seem wrong for your hardware baseline.
  • Open question flagged in §9: free / donation-ware / freemium stance.

🤖 Generated with Claude Code

Repo audit + 2026 VJ landscape research distilled into a product plan:
demolish customization bloat, build a WebGL2 two-deck compositor with
ISF effects and a beat-clock, one dark performance UI, and sharpened
Archive.org crate-digging ergonomics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
staticbuffet Ready Ready Preview, Comment Jul 19, 2026 9:51pm

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive Product Requirements Document (PRD) for Static Buffet 2.0, outlining a modernization plan that includes building a WebGL2 compositor, simplifying the UI to a single dark performance interface, and removing legacy features and unused dependencies. The reviewer provided a crucial technical correction regarding the limitations of transferring a MediaStream via BroadcastChannel, suggesting a direct same-origin window reference instead to successfully display the stream in the pop-out window.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread PRD.md

### 5.4 The signal (output done right)

- **Render once.** The compositor renders one canvas; the pop-out window receives `canvas.captureStream(60)`. `BroadcastChannel` replaces the postMessage/localStorage sync (`PopOutPlayer.tsx:327–631`). No more two players pretending to agree.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While using BroadcastChannel is excellent for syncing playback controls and state between windows, please note that a MediaStream (returned by canvas.captureStream()) cannot be serialized or transferred via BroadcastChannel or postMessage due to structured clone limitations.\n\nTo display the stream in the pop-out window, the parent window must directly assign the stream to the pop-out window's video/canvas element via the same-origin window reference (e.g., popoutWindow.document.getElementById('output').srcObject = stream). This requires the pop-out window to remain same-origin and be opened via window.open so the parent retains a direct reference.

Suggested change
- **Render once.** The compositor renders one canvas; the pop-out window receives `canvas.captureStream(60)`. `BroadcastChannel` replaces the postMessage/localStorage sync (`PopOutPlayer.tsx:327631`). No more two players pretending to agree.
- **Render once.** The compositor renders one canvas; the pop-out window receives the canvas captureStream(60) via direct same-origin window reference. BroadcastChannel replaces the postMessage/localStorage sync for control state (PopOutPlayer.tsx:327-631). No more two players pretending to agree.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 713608460d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread PRD.md
Comment on lines +121 to +123
- **Render once.** The compositor renders one canvas; the pop-out window receives `canvas.captureStream(60)`. `BroadcastChannel` replaces the postMessage/localStorage sync (`PopOutPlayer.tsx:327–631`). No more two players pretending to agree.
- **One-click projector fullscreen** via the Window Management API (`getScreenDetails`) on the second display.
- **Record my set**: `MediaRecorder` on the output stream → downloadable video. Every session becomes shareable content — this is how tools like this spread.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve audio in the captured output stream

canvas.captureStream(60) supplies only the canvas video track, while the deck audio is produced separately from the hidden video/audio graph. Consequently, any set with audio will produce a silent pop-out and silent MediaRecorder download under this design. Mix the deck/beat audio into a MediaStreamAudioDestinationNode and add its audio track to the captured canvas stream before using it for output or recording.

Useful? React with 👍 / 👎.

@drftstatic
drftstatic merged commit 13bdbfb into main Jul 19, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant