My Hands-Free AI Streaming Setup (CodeRabbit + Claude Code)
I wanted to stream AI automation work on Twitch, but the setup is annoying — three machines (DGX Spark, Mac Mini, MacBook), one camera, and no spare hands to switch scenes while I'm typing into Claude Code. So I built a voice-and-chat-controlled OBS rig, end to end, using a strict agentic engineering loop: Claude Code writing, CodeRabbit reviewing, both running on the same PR until each phase passes clean. This post is half about the rig, half about the loop — which I think matters more.
Watch the video:
Quick disclosure: CodeRabbit sponsored the video. The workflow opinions below are mine — I'd been wanting to test a "model writes, model reviews" loop on a real project and this gave me an excuse.
What I wanted
The end state was simple to describe and a pain to wire up:
- Multi-device OBS: seamless scene-switching between the DGX Spark screen, Mac Mini screen, MacBook screen, and the physical camera
- Voice control: "switch to DGX Spark" / "switch to MacBook camera" works from anywhere in the room
- Twitch chat control: viewers type
!cam DGXor similar and the scene switches - Push-to-talk dictation: hold left shift, speak, transcript drops into whichever text field has focus (so I can voice-prompt Claude Code while reading the chat)
- Headless stream start/stop: FFmpeg-driven, no clicking around in the Twitch UI
Underlying stack: OBS WebSocket for scene control, FFmpeg for the streaming layer, Parakeet running on the DGX Spark for local STT (low-latency, no API call per word), small Node services on each machine for the listeners.
The agentic loop (this is the interesting part)
Instead of one-shotting it with Claude Code, I broke the work into phases and put a review gate between each phase. The pattern:
- Write a PRD up front (full system requirements — devices, scenes, commands, latency targets)
- Write a
CLAUDE.mddefining the per-phase workflow (branch → implement → tests → review) - For each phase:
- Claude Code (Opus 4.7, dangerously-skip mode) reads the PRD, picks the next phase, creates a branch
- Implements, runs the test suite, commits
- Triggers the CodeRabbit CLI agent as a sandboxed reviewer — major/minor findings stream back to Claude Code
- Claude Code autonomously addresses findings, re-tests, re-reviews until clean
- Opens a PR — CodeRabbit's GitHub app reviews it again at PR level (different lens than the CLI pass)
- Claude polls for PR comments, applies fixes, re-pushes
- Merges when both gates pass clean
- Loop into the next phase
This is the same agentic-loop shape I described in the 3-part AI agent system — skill + headless + tools — but with an explicit second AI sitting in the review role. The interesting property is that the two models check each other. Claude Code wrote the code; if it missed an edge case, CodeRabbit usually catches it. If CodeRabbit nitpicks something pointless, Claude Code argues back via the fix attempt and the next review either agrees or pushes harder.
Phase 1 caught one major and one minor finding (package issue + an OBS WebSocket type). Second review pass: clean. PR-level review surfaced four actionables + three nitpicks. Round-tripped those, clean on the second PR review, merged. Total active time on phase 1: ~15 minutes of supervised loop, mostly watching.
What this changes about how I work
The single most useful thing this loop produces is permission to walk away. With a single-model agent, you tend to babysit — you don't fully trust the output until you've eyeballed it. With a two-model loop where the reviewer is independently strong, you can let it run, come back in 20 minutes, and find a merged PR with the rough edges already sanded down.
That changes the unit of work from "one careful interaction with the agent" to "spawn a phase, do something else, check back". This is the same shift I wrote about in the long-running browser-automation post — same pattern, different domain.
Things I think matter for making this loop actually work:
- Strict phase boundaries. Each phase has one feature. Don't let Claude Code accidentally smash phase 2 work into phase 1's PR.
- A real PRD. If the spec is loose, the reviewer can't evaluate. If the spec says "voice command 'switch to DGX' triggers OBS scene 'DGX Spark' within 500ms", CodeRabbit can check that and Claude Code can implement it.
- Test coverage that doesn't lie. The whole loop relies on "tests pass" being a real signal. Spending 5 minutes up front on a meaningful test scaffold pays back many times over.
- Don't intervene mid-phase. Same lesson from the Polymarket head-to-head — if you tell the model it's failing, it shifts strategy. Let the loop finish.
The rig running
By the end of the build, the stream rig actually works. Voice "switch to DGX" → OBS swaps scenes with about a second of lag. Push-to-talk dictation drops transcript into the focused text field — same effect as built-in macOS dictation but powered by the local Parakeet model, so no round-trip to a cloud STT and no cost per token. Twitch chat commands hit the same OBS WebSocket bus through a small listener. !start and !end from chat literally start and stop the Twitch stream via FFmpeg.
Limitations I haven't fixed yet:
- Lag is real on chat commands — a couple of seconds end-to-end. Fine for "switch cam", awful for anything time-sensitive.
- No TTS yet. The chat → audio loop is half-built; Parakeet handles STT, but I haven't wired a TTS model to read messages back. Easy next step.
- The push-to-talk shortcut sometimes drops the first 100ms. I think it's a keyboard-listener startup issue but haven't dug in.
What I'll try next
The natural extension is to put a Claude Code agent on the stream itself, like I did in the Twitch agent post — but now with this hands-free rig underneath, so the agent can also drive scenes and respond to chat in real time. That gets to a fully autonomous stream where I show up, hit start, and the rig + agent runs the show.
If you want to drop by while this is live, the Twitch link goes up in the AI_automata Discord when I'm streaming.
Resources
- CodeRabbit — AI code review, CLI agent + GitHub PR review. Sponsor of the video; free tier covers a real amount of usage before paid.
- OBS Studio + the WebSocket plugin — the scene-switching layer.
- Parakeet — local STT model running on the DGX Spark.
- Claude Code AI agent controls Twitch — the autonomous-stream pattern this rig will plug into.
- 3-part AI agent system — base agentic-loop shape.
- AI_automata Discord — stream links and discussion.
FAQ
What I wanted?
The end state was simple to describe and a pain to wire up:
What this changes about how I work?
The single most useful thing this loop produces is permission to walk away .
What I'll try next?
The natural extension is to put a Claude Code agent on the stream itself , like I did in the Twitch agent post — but now with this hands-free rig underneath, so the agent can also drive scenes and respond to chat in real time.