Claude Code × DJ Deck Controller
While multiple Claude Code sessions run in the background, you can stay focused on other work.
Whenever a session needs a response, choices appear on the deck — one button press moves it forward.
Gaming, writing docs, focused on another window —
no terminal switch, no typing, just press the button.
// live state simulation
Why Claude DJ
Claude Code sessions run in the background while I stay on task. I only look at the deck when a response is needed.
Gaming, writing, browsing — whatever you're doing, when Claude needs input just press a deck button. No terminal switch, no typing, no context break.
Main task, side branch, separate project — however many sessions, whichever one needs a response surfaces automatically on the deck.
Ulanzi D200 physical buttons, browser virtual deck, touch monitor — pick the interface that fits your setup. The behavior is the same regardless of input method.
Extensibility
Claude DJ clients connect to the Bridge over a single WebSocket. No restrictions on input device form factor.
USB stream deck like the Ulanzi D200. Tactile button feedback lets you operate without looking. Translator Plugin bridges Bridge and UlanziStudio.
Launch Virtual DJ in a browser with no extra hardware. Fastest way to get started. Direct WebSocket connection to the local Bridge.
Attach a touch monitor to your workstation and run the web app fullscreen. See all choices at a glance and respond with a tap.
An Android tablet or mini PC with its own CPU communicates with the Bridge over the network — a fully independent deck terminal separate from your workstation.
How It Works
The choice-format skill is automatically injected into the session. From that point Claude outputs every decision as an AskUserQuestion tool call.
When AskUserQuestion fires the PermissionRequest hook, the Bridge transitions the session to WAITING_CHOICE. For standard tools it transitions to WAITING_BINARY. Blocks up to 60s waiting for a response.
The moment state changes, the new layout is broadcast over WebSocket. Cross-session focus filtering ensures other sessions don't overwrite the current choice screen.
Review choices on the deck and press a button. No focus switch, no typing. The response is routed precisely to the focused session.
The Bridge returns the selection as a hook response, and Claude Code immediately proceeds to the next step based on that choice.
Core Mechanism
The heart of Claude DJ is the choice-format skill. This single skill changes Claude's behavior at the model level — making it call the structured AskUserQuestion tool at every decision point.
Claude outputs a numbered list as plain text. The user must manually type a number in the terminal — the deck cannot detect this.
Claude calls the AskUserQuestion tool. This triggers the PermissionRequest hook — the only hook that blocks.
Key Distinction
The skill blocks the anti-pattern of listing plan descriptions as choices. "Shall we proceed?" is a confirmation, not a choice.
2–4 genuine alternatives exist, and the outcome differs depending on which option is chosen.
Describe the plan in text, then ask for approval with two options: proceed or change direction.
Mixing plan descriptions and additional scope as same-level choices. The user cannot meaningfully "choose" anything.
State Machine
The moment a session state transitions, the deck's button layout changes entirely. During processing, buttons pulse in a wave to visually signal what's running.
Task complete or awaiting input. All buttons deactivated.
When tool execution is detected, buttons blink with staggered delays to visually indicate work in progress.
Permission request received. Only Approve and Deny are active; all other buttons are inactive.
The skill-driven AskUserQuestion call blocks the hook. Pressing a button instantly delivers the selection to Claude.
Multi-select mode. Toggle each item on or off, then submit all at once with the Done button.
Claude output choices as text and is paused. A waiting indicator appears on the deck; you must respond directly in the terminal.
Architecture
WebSocket Protocol
WebSocket message schema exchanged between the Bridge Server and clients (Virtual DJ or Ulanzi D200).
Implementation Milestones
Get Started
Two lines in a Claude Code session and you're set. Start using the deck right away.
7 hooks + choice-format skill registered automatically.
Virtual DJ dashboard at http://localhost:39200
No terminal focus, no typing — just press the button.
Manual Install (git clone)