Inspiration
IRL streamers can be located without anyone hacking anything. One viewer asks what city it is, another guesses the street, a third confirms it. Chat becomes a real-time location finder, and that's how stalking, stream sniping and swatting setups can begin.
The usual advice is to have a dedicated safety mod watch for oddly specific questions, but most small and mid-size streamers don't have one. Existing tools mostly blur video. We wanted something that watches what chat is doing together.
What it does
Fly Swatter is a private safety moderator for your own Twitch channel. It spots different viewers converging on the same place, and a danger score rises as they do.
You choose how far it goes:
- Observe: only watches, and shows what it would have done.
- Assist: deletes shared locations, confident guesses and swarm messages, and alerts your mods.
- Guardian: adds stricter deletion, warnings and automatic Shield Mode.
Harmless talk about hometowns, games and coffee shops stays quiet. It never repeats the place in chat, never contacts authorities, and never knows where you really are.
How we built it
Fly Swatter is a TypeScript app with a Fastify server and a React dashboard. It connects to Twitch through OAuth, EventSub over WebSocket, and the Helix chat and moderation APIs.
Each message passes through a rules filter, then an optional OpenAI classifier, then a tracker that counts distinct people per place. That feeds a risk score, which drives the actions. With no API key, the built-in rules take over. The app runs locally, bound to 127.0.0.1.
We built the app with OpenAI Codex and logged each milestone in BUILD_LOG.md. The project has 212 passing tests.
Challenges we ran into
Deletions can leak information. If only correct guesses disappeared, deleting them would confirm the location to snoops. So Fly Swatter is location-blind: it has no setting for your real location, and decisions depend only on how chat behaves. A test replays identical chat naming different places and requires identical actions and risk.
Keyword rules punished normal chat. QA found "69420" being deleted as a ZIP code, and "looks like fun" flagged as a location guess. We split the rules into strong and weak groups, so weak phrasing only counts next to a real place.
What we learned
Our first accuracy numbers were overfit. After tuning, the rules scored 98% precision on the same examples we'd tuned them on. On 31 new examples measured once, rules-only mode got 94% precision and 8% benign false positives, but detected only 79% of risky messages. We learned to report the held-out number.
Current status
Assist deletion is verified on a real Twitch channel. Live swarm and mod-alert checks are still pending.
What's next
- Finish live multi-account swarm and mod-alert testing
- Scan the streamer's own OBS feed to warn when signs or storefronts make them locatable, without naming the place
- Add live raid detection and new-account weighting
- Add a panic button that switches OBS to a BRB scene and turns on Shield Mode
- Add an incident report the streamer can choose to export, never sent automatically
Built With
- fastify
- node.js
- oauth
- openai
- openai-codex
- pino
- react
- twitch
- twitch-eventsub
- twitch-helix-api
- typescript
- vite
- vitest
- websockets
- zod
Log in or sign up for Devpost to join the conversation.