Beamy
Beamy Control
Show controls · Midnight Call Sign loaded
ORIGIN: … OBS: NOT CONNECTED NOW PLAYING: OFF SCENE: — Twitch · Disconnected
Ready check
ORIGIN MISMATCH — Control Panel cannot talk to overlays BroadcastChannel and localStorage are sandboxed per-origin. Your overlays are likely loaded from http://127.0.0.1:8888/, but this dock is loaded from . Re-dock from the matching URL below.
http://127.0.0.1:8888/control-panel.html
Get Beamy readyOBS connection, account, and show kit checks Checking…
First run
Connect once. Then create with Ask Beamy.
CHECKING…
Beamy keeps OBS setup, accounts, and show-kit checks in one place. Ask Beamy is the creative workspace.
RuntimeChecking…
Command BusChecking…
OBSChecking…
Beamy AccountChecking…
Show KitChecking…
Symphony ScoreChecking…
Waiting for the local server, OBS WebSocket, and Beamy session.
How this works: Every pack field broadcasts live to overlays via BroadcastChannel + localStorage. For v1.0 live events, keep Beamy Control open as an OBS dock so Twitch events can reach installed browser sources. OBS control stays behind Beamy actions, and the WebSocket password is session-only unless you explicitly choose the local remember option. Ctrl+Z undoes, Ctrl+Y redoes. Dock inside OBS: View → Docks → Custom Browser Docks.
Ask Beamy CreationsEMPTY
Choreographer0 RULES
Wire creations together. When X fires, also fire Y. Use it to ripple effects across creations — a subscriber lands, the pancake widget runs AND particle-burst goes off AND a thank-you chat card appears, all from one rule.
New rule
When also
Target
Twitch Live Events LIVE LISTENING
Listening for events. Connect Twitch + subscribe to see real activity here.
Stage Sets0 SETS
Save the current enabled flags + scene bindings + control values across every creation as a named preset. One click switches the whole library between "Game Day", "Music Stream", "Just Chatting", or whatever you call it.
ActivityLIVE
The pulse of Beamy. Subs, beats, chat triggers, installs — every event flowing through the system shows up here in real time.
Stream Event SimulatorTEST EVENTS
Test the current Ask Beamy creation with realistic stream events before connecting real platform triggers. Chat fires on the manual-trigger bus so any chat-card creation with a matching !command reacts immediately.
Live ControlsON AIR
Transition Fire the selected choreography score.
Symphony Run the flagship scene-change score.
Alert Send the selected Beamy test alert.
ClipTinder Start the configured viewer clip activity.
3D Vinyl Force the now-playing reveal immediately.
Beamy Account & Cloud NOT SIGNED IN
Beamy for OBS
One account · every integration

Sign in once and connect Spotify, Twitch, YouTube, Discord through Beamy's verified apps. No password, no developer-app setup. The same Beamy account works in every Beamy Pack and the Beamy desktop app.

First time? Sign-in is sign-up — Google · Discord · Twitch · GitHub · Email
Beamy Alerts NOT SIGNED IN
Pick a template per event type and fire a test alert through the deployed Beamy alerts pipeline. Real Twitch events use the same bindings.
TWITCH EVENTSUB
checking…
Realtime idle
Listening for:
The test inserts a synthetic uplink.event_log row with the rendered alert payload. The alert overlay animates it via Supabase Realtime — byte-identical to a real Twitch event.
Top Clips SIGN IN TO LOAD
The most-viewed clips from your Twitch channel. Foundation layer for ClipTinder and the clip-driven activity family.
ClipTinder IDLE
Run a chat-voted ClipTinder session for starting-soon, BRB, intermission, or ending scenes. Viewers vote with !like / !dislike / !superlike. Champion clips emerge in real time.
1 · WHAT WILL VIEWERS VOTE ON?
How far back to pull your clips from.
2 · WHERE SHOULD IT APPEAR IN OBS?
Click any mode to install or update the OBS source. Full / Cinema preserve your manually-placed position; Compact corner pins to your chosen anchor.
ALL-TIME TOP CLIPS
Every clip you've run through ClipTinder accumulates here. Lifetime score = likes + 3·super − dislikes. Click a clip to copy its source URL.
Spotify RevealACTIVITY · 2
The now-playing widget that announces itself. Idle in a corner; every N minutes or on !song the album swells, the title types in, the bloom shifts to the album's color. Built on the same activity-manifest pattern as ClipTinder.
1 · INSTALL & CONNECT
CHECKING…
2 · WHEN SHOULD IT REVEAL?
every 10 min 30s 8s
Set interval to 0 to disable auto-reveals (chat commands still work). Cooldown rate-limits chat-triggered reveals.
◐ CORNER WIDGET
Always-visible vinyl record showing the current track. Lives in a corner of your canvas.
Corner preset
bottom-right
Custom placement
overrides the preset
★ HERO REVEAL
The big announcement: album art zooms, title types in, artist signs underneath. Fires on interval, on !song, or when you click the Show button below.
— fires immediately, regardless of cooldown
Custom placement
drop a marker, drag to size + position
▶ 3D VINYL NOW-PLAYING
Real-time ThreeJS turntable rendered into an OBS browser source. Top-down idle (looks like a 2D widget) → camera tilts to cinematic 3-quarter on reveal. Shares timing & chat-command settings with Hero Reveal above; 3D-specific knobs below.
12 RPM
beat-locked halo + breath
album-hue eruptions on downbeats
when real tempo isn't available
🎥 Camera Animation advanced — fine-tune the dolly feel
Pick the easing curve + duration for the idle-to-fullscreen camera dolly. Both the camera lerp and canvas scale transition use the same curve so they always land in sync.
1.80s
🎛 Visual Effects isolate each effect — A/B-test your mix
Toggle each layer on/off. Click Refresh on the source after changes to apply (each toggle emits its own URL param so the overlay reads the choice on reload).
Note: Sparks and Audio reactive have their own toggles above. The granular controls here let you isolate each pulse/glow/animation layer separately for fine-grained A/B testing.
⚡ Trigger Effects fire individual layers — no reveal needed
Test or bespoke-fire each visual layer independently. Each effect runs for the duration set below. Useful for hyping a moment without a full song reveal, or for AI Director / chat-bot integrations.
3.0s
⭐ Channel Point Reveal viewers redeem → vinyl reveals
Pick a Twitch channel-point reward — viewers who redeem it fire the cinematic reveal in real time, with their @name on the “asked by” line. Affiliate / Partner status required for channel points.
◇ 3D Gizmos drag OBS sources to control the 3D scene
Turn on a gizmo, drop a colored marker into your OBS scene, drag it. The corresponding 3D element follows in real time. Lock when you're satisfied — gizmo source removes, position persists.
✨ Transitions — Beamy ChoreographyREVOLUTIONARY
Compositional transitions — not single effects. Each transition is a timeline of actions: scene switches, source moves, audio cues, browser-source signals, particle bursts. Pick one + click ▶ Fire to play. Custom JSON-defined transitions can do anything the OBS WebSocket + browser-source overlays can do.

Phase 1 MVP shipping now — Phase 2 visual timeline editor + Phase 3 smart triggers + Phase 6 AI Director persona coming next. See docs/product/beamy-uplink-transitions-vision.md for the full vision.
📺 Beamy Stinger Overlay — install this top-layer browser source on your scene to get visible swipe bars, fullscreen flashes, and particle bursts during Beamy transitions. Without it, transitions only do OBS-native fade/cut.
Excluded scenes (don't auto-add stinger here)
Saves automatically. Leave blank to install on every scene.
… probing optional plugins (Move, Adv. Scene Switcher)
📚 My Transition Library defaults + custom — JSON-defined
Built-in defaults can't be deleted. Your custom transitions persist in browser storage. Click any to load into the JSON editor + tweak. Phase 2 visual timeline editor coming.
📖 Action Vocabulary what actions can fire — JSON reference
scene_switch — { type, scene: "name" or "{target}", delay }
set_transition_style — { type, style: "Cut" | "Fade" | "Swipe" | …, delay }
set_transition_duration — { type, duration_ms: 1500, delay }
source_transform — { type, scene: "name" or "{current}", source, from?: {…}, to: { positionX, positionY, scaleX, scaleY, rotation, … }, duration_ms, easing: "glide" | "inOutSextic" | …, delay }
via_scene — { type, transition_scene: "BEAMY_TRANSITION_SCENE", target_scene: "{target}" or "name", hold_ms: 1500, delay }
cascade_out — { type, direction: "mixed|left|right|up|down|scale|random", stagger_ms: 80, duration_ms: 600, easing: "inOutSextic" | …, delay } — animates every NON-Beamy layer of the CURRENT scene OFF-screen with staggered delays, then automatically restores originals after the scene_switch (invisible). Pairs with cascade_in for full bidirectional choreography.
cascade_in — { type, target_scene: "{target}" or "name", direction: "mixed|left|right|up|down|scale|random", stagger_ms: 90, duration_ms: 800, easing: "inOutSextic" | …, delay } — animates every NON-Beamy layer of the DESTINATION scene from off-screen to its position, with staggered delays. Beamy-managed layers (sources prefixed "Beamy ·") skip the cascade.
capture_scene_to_3d — { type, source: "{program}|{preview}|name", mode: "card_flip|zoom_out|peel_off|shatter|into_portal|tunnel", duration_ms: 1600, fps: 24, format: "jpg"|"png", quality: 75, color: "#hex", width: 854, height: 480, delay } — SCENE-IN-3D, LIVE. CP polls GetSourceScreenshot at fps (default 24) for duration_ms using JPEG @ 854×480 (default; ~50KB/frame, 20× smaller than PNG @ 720p — that fixed the freeze). Frames ship via BroadcastChannel (primary, no disk I/O) with localStorage fallback. Stinger hot-swaps a single shared Texture/Image pair so subsequent frames cost zero GC. CAMERA animates per-mode (dolly, punch, shake). Modes: card_flip (Y flip + gravity drop, camera dolly), zoom_out (push-pull + starfield, camera recede), peel_off (cylindrical paper curl), shatter (24-fragment ballistics with gravity + tumble, camera shake), into_portal (vertex spiral + starfield reveal, CAMERA PUNCH FORWARD through portal), tunnel (scene wraps inside 3D cylinder, CAMERA FLIES THROUGH it, starfield + nebula at exit). Custom GLSL shader: chromatic aberration / vignette / edge glow / radial pull / twist per-mode. Tone-mapping bypassed → 1:1 OBS color match.
browser_signal — { type, key: "localStorage_key", value: "any", delay } · For key="beamy_transition_phase" you can also pass { style: "swipe|portal|lightspeed|vortex|glitch", color: "#hex", intensity: 0..1 } and the Stinger overlay will pick that 3D mode for the phase.
source_visibility — { type, scene, source, enabled: true|false, delay }
filter_toggle — { type, source, filter, enabled: true|false, delay }
obs_hotkey — { type, hotkey: "OBS_KEY_NAME", delay }
effect_fire — { type, effect: "sparks|ring|halo|orbit", intensity: 0..1, delay }
move_source — { type, scene: "{current}|name", source, to: { positionX, positionY, scaleX, scaleY, rotation, … }, duration_ms, easing, move_filter?: "filter-name", delay } — GPU-accelerated source animation. When the Move plugin is detected AND move_filter is provided, dispatches a native filter animation through OBS (CallVendorRequest 'move-transition'/'move_source'). Falls back to client-side SetSceneItemTransform when Move plugin is missing.
wait — { type, delay } (pure delay, useful for choreography)
Phase 5 adds: audio_play, voice_line (TTS), chat_message, Move-plugin offload for source_transform.
OBS Scene ControlOFFLINE
Connect OBS usually just paste the password
Click any scene to switch the PROGRAM output. Use Refresh all browser overlays when you've updated overlay HTML and want every browser source to pick up the new code (like a Ctrl+F5 for every CEF instance).
TwitchNOT CONNECTED
Twitch OAuth setup — one-time app create at dev.twitch.tv/console/apps/create (90s, no review). Fill in:
  • Name: anything (e.g. "Midnight Call Sign")
  • OAuth Redirect URL: http://127.0.0.1:8888/twitch-callback.html
  • Category: Broadcasting Suite
  • Client Type: Public
Copy the Client ID, paste below, click Connect. This unlocks follows, subs, bits, raids, channel points, and chat — all live.
Now PlayingOFF
Manual entry only. Set title + artist below. No polling.
Manual override (always wins — leave blank to use source above):
Brand · Station ID
Host
Current Guest (Line 2)
Cold Open · Welcome
Sign Off · Goodnight
Subtitle / Caller Ticker
Chat can push one-shot messages via !msg your message here — shows briefly on-screen with chatter's avatar.
Weather Window (for Backdrop)
Sensitivity · Reactive Widgets
×1.6
×60
Presets
Presets fill in ALL matching fields at once. Each preset is one undo step (Ctrl+Z reverts the whole preset).
On-Air FrameSCREEN SHARE
Creates a MCS Screen Frame browser source in the current OBS scene (full 1920×1080). After it appears, drag/resize it in OBS to match your screen-share exactly — OBS saves the size with the scene.
Dock LayoutLOCAL
Density Choose how much vertical space the OBS dock uses.
Operator Start with show-running controls.
Creator Start with pack and visual editing controls.
Power User Show every available section in one scroll.
Customize Live Page Pin the panels you want beside scene control and live actions. This is local to this OBS profile/browser dock.
Advanced · Automation, Plugin & SetupPOWER USER
▸ Stream Deck URLs (Web Browser action)
Stream Deck → System → Website action pointed at the URLs below. Stock Elgato software. Brief visual flash per press.
Zero-flash alternative: use Bitfocus Companion → Generic HTTP module → GET the URL. Silent.
Native plugin: installed via stream-deck-plugin/install-plugin.ps1.
READY-MADE URLS
▸ Source URLs · OBS Browser Sources
Exact URLs to paste into OBS Browser Source → URL. If you duplicate a browser source to another scene and it stops updating independently (OBS shares CEF state across identical URLs), append ?instance=2 so OBS treats it as a new source.
▸ Setup & Troubleshooting
Camera stops working after closing/relaunching OBS?
Run install-mcs-camera.ps1 (right-click → Run with PowerShell, approves one UAC prompt). Patches every OBS shortcut + writes Chromium policy registry + creates a backup Desktop shortcut. Safe to re-run. Does not use IFEO.
Why 127.0.0.1 and not localhost?
Spotify rejects localhost as an OAuth redirect URI but accepts 127.0.0.1. BroadcastChannel is also sandboxed per-origin — so every overlay + the Control Panel must share one origin. Pick 127.0.0.1:8888 for everything.
Stream Deck plugin — where to find it after install:
  1. Run stream-deck-plugin/install-plugin.ps1 once.
  2. Relaunch Stream Deck Software.
  3. Open Stream Deck Software → Actions panel on the right → search "Midnight Call Sign" — six actions appear.
  4. Drag any action onto a button → configure in the Property Inspector (scene dropdown auto-populates from OBS).
Now Playing options ranked by ease:
  1. ListenBrainz — zero API key, zero OAuth. Just a username.
  2. Last.fm — one-time API key (yours), users paste only their username.
  3. Spotify — most real-time but each user needs their own developer app.
  4. Off + Manual — type title + artist directly.
SAVED
Ctrl+Z undo · Ctrl+Y redo