Project Info
Inspiration
I'm building a creator brand ("aycee") where my life plays out like a TV show. The problem: when you're solo streaming, there's no director calling the beats, hyping moments, or framing chaos in real time. So I built one.
What it does
Stream Director listens to a streamer's mic live and decides, in real time, whether to flash an on-screen director cue such as a quick reaction, a big "episode" title card for scene changes, or a "while you were away" catch-up summary after an ad break. It defaults to silence and only fires when something genuinely notable happens, so cues feel earned instead of spammy. How I built it Deepgram streams live speech-to-text from the mic A rolling 60-second transcript buffer feeds into Claude every 15 seconds Claude decides between three response types: a quick REACTION cue, a bigger SCENE/episode title card, or (after a simulated ad break) a CATCHUP summary A lightweight Express server exposes the latest cue via a polling endpoint A branded HTML/CSS overlay (designed for OBS browser sources) animates the cues in Challenges I ran into The hardest part was tuning the AI to know when to stay silent. A naive version fires a cue on every beat, which is noisy and useless. I built in a hard cooldown plus an explicit "default to silence" instruction so the system only reacts to things that actually matter, which took several rounds of live testing and prompt tuning to get right. Accomplishments that I'm proud of Getting the AI to actually know when to stay quiet. Most reactive AI demos fire constantly and feel gimmicky. Getting Stream Director to sit silent through minutes of filler talk and only fire when something genuinely happened took real iteration, and seeing it correctly catch a topic change or a joke landing live, on the first real test, felt like a genuine "it works" moment. I'm also proud that I built three distinct, working cue types (REACTION, SCENE, CATCHUP) solo in one weekend, each requiring its own reasoning logic and visual treatment, and got the entire pipeline — mic to transcript to AI decision to live overlay — running end-to-end, multiple times, with no manual triggers. What I learned The technical integration (Deepgram, Claude, Express) was the easy part. The real lesson was that prompting an LLM to make a judgment call, deciding when NOT to act, is a fundamentally different and harder problem than prompting it to generate content. Cooldowns, explicit "default to silence" instructions, and a lot of live testing were what actually made the system feel intelligent rather than noisy. I also learned a lot about real-time audio pipelines — buffering live transcripts, managing polling-based UI updates, and debugging issues that only show up when multiple async pieces (mic input, API calls, browser rendering) are running simultaneously.
What's next
Hooking into real Twitch chat and ad-break APIs instead of the simulated versions used in this demo, and running it live on my own channel.
This repository has no readme, or GitHub could not be reached.
Analysis
View
Metric
No commits on this project resolved to a GitHub account.
Technology
- AnthropicIn code
- ExpressIn code
- HTMLIn code
- JavaScriptIn code
- Node.jsClaimed
4 of 5 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
11 KB
Source files
2
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
anushharish1/stream-director
6 files · 53 KB · @ d10ffcb
Structure
Application logic
1 file · 17%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- JavaScript60%
- HTML40%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 5- @anthropic-ai/sdk
- @deepgram/sdk
- dotenv
- express
- mic
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Branded HTML/CSS overlay for OBS with animated cuesVerified
A branded HTML/CSS overlay (designed for OBS browser sources) animates the cues
Claimed on Devposthigh confidencepublic/overlay.html:143— poll() fetches /latest-cue every 2 seconds and toggles CSS 'show' classes to animate reaction, scene, and catchup cardspublic/overlay.html:7— Transparent body background is consistent with an OBS browser-source overlay designpublic/overlay.html:125— Branded 'AYCEE • LIVE' label ties overlay to the creator brand mentioned in the inspiration claim
Catch-up summary after simulated ad breakVerified
a 'while you were away' catch-up summary after an ad break (simulated ad break in this demo)
Claimed on Devposthigh confidenceindex.js:215— stdin listener toggles adBreakActive on typed 'ad start'/'ad end' commands, simulating an ad break rather than a real ad APIindex.js:122— generateCatchupCue summarizes the buffered ad-break transcript into a CATCHUP cue
Claude decides between REACTION, SCENE, and CATCHUP cue typesVerified
Claude decides between three response types: a quick REACTION cue, a bigger SCENE/episode title card, or a CATCHUP summary
Claimed on Devposthigh confidenceindex.js:47— CUE_SYSTEM_PROMPT instructs Claude to choose between REACTION and SCENE formats, or NONEindex.js:103— Response parsing branches on REACTION: and SCENE: prefixesindex.js:122— generateCatchupCue sends a separate Claude prompt requesting a CATCHUP: formatted summary
Default to silence / cooldown so cues are not spammyVerified
It defaults to silence and only fires when something genuinely notable happens, cues feel earned instead of spammy; hard cooldown plus explicit default-to-silence instruction
Claimed on Devposthigh confidenceindex.js:53— System prompt explicitly states 'DEFAULT TO SILENCE. Only fire a cue when something genuinely notable just happened' and instructs responding NONE otherwiseindex.js:78— secondsSinceLastCue check enforces a 45-second cooldown, skipping the Claude API call entirely while in cooldown
Express server exposing latest cue via polling endpointVerified
A lightweight Express server exposes the latest cue via a polling endpoint
Claimed on Devposthigh confidenceindex.js:31— Express app defined, serves static public dir, and exposes GET /latest-cue returning latestCue as JSON, listening on port 3000
Live speech-to-text via Deepgram from mic inputVerified
Deepgram streams live speech-to-text from the mic
Claimed on Devposthigh confidenceindex.js:155— DeepgramClient is initialized and a v1 listen connection is openedindex.js:171— mic package captures audio and pipes raw audio data into the Deepgram socket via micInputStream.on('data', ...)index.js:191— connection.on('message') handles Results events and extracts final transcripts
Rolling 60-second transcript bufferVerified
A rolling 60-second transcript buffer feeds into Claude every 15 seconds
Claimed on Devposthigh confidenceindex.js:9— addToBuffer stores transcript entries with timestamps and filters out entries older than 60000ms (cutoff)index.js:210— setInterval calls maybeGenerateCue every 15000ms, feeding the buffer text to Claude
Real Twitch chat and ad-break API integrationClaimed only
What's next: hooking into real Twitch chat and ad-break APIs instead of the simulated versions used in this demo
Claimed on Devposthigh confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.