Inspiration
I was watching Jynxzi’s tournaments and kept thinking: what if I could actually bet on which team wins? Everyone in chat already has a call, whether it’s “this team is cooked” or “they’re gonna win,” but those opinions just scroll past and nobody is ever held to them. I also noticed that chat mostly talks to the streamer, not to each other. I wanted something that lets chatters back their call, compete against each other, and watch the odds move as the match swings, without any real money involved. That became Call It.
What it does
Call It turns Twitch chat into a live prediction market. A streamer or mod opens a question, and viewers trade YES or NO with virtual points. The price moves with every trade, and viewers can sell their position as the odds change. When the market resolves, winners are paid out and a leaderboard tracks the best callers. A browser-source overlay shows the odds bar, price chart, recent trades, countdown, and leaderboard live in OBS.
Streamers stay in control. They can also let the bot suggest chat-activity markets (message volume, emote spam, unique chatters) that a mod approves or skips, or turn on full auto per channel. Every viewer starts each market with the same stake, and each channel’s points, markets, and leaderboard are separate. It’s virtual points only, with no real money.
How we built it
It’s a Python asyncio bot connected to Twitch through OAuth, EventSub (channel.chat.message over WebSocket), and the Helix API for replies, with automatic token refresh. A market engine prices trades with LMSR (the same kind of automated market maker prediction markets use), stores state in SQLite, and exposes it to the overlay through a small aiohttp server with Server-Sent Events. A simulator runs fake viewers with different trading personalities, so the whole thing can be tested and demoed without a live audience.
I built it with OpenAI Codex, one scoped prompt per feature: the bot, the market engine, multi-channel support, the overlay, the simulator, auto markets, and the anti-gaming safeguards. An AGENTS.md file kept each session consistent. I tested every step myself and fed bugs back to Codex.
Challenges we ran into
- Gaming activity markets: If a market asks “will chat send 50+ messages?”, traders can bet YES and then spam. I added streamer approval, a trading lock before the deadline, and excluded traders’ messages from the counters. It’s still not perfect, which the README says honestly.
- Fairness: My first design gave points for chatting, which favored people who’d been around longest. I switched to an equal stake for every viewer in every market, scored by cumulative profit.
Accomplishments that we're proud of
- It works end to end on a real Twitch channel: commands in chat, live odds on the overlay in OBS.
- A market engine with sound pricing and a point-conservation check, where payouts equal stakes plus the market maker’s bounded gain or loss.
- Per-channel isolation, so streamers never share points or leaderboards.
- Turning a design flaw I spotted myself into actual safeguards.
What we learned
- Market design is mostly about incentives. If the people trading can also change the outcome, you have to design around it.
- Scoped prompts and a shared instructions file make Codex much more predictable, and you still have to run and test everything yourself.
- A simulator is worth building early, since it makes testing and demos possible without a crowd.
What's next for Call it
- Multi-outcome markets. Right now every market is YES or NO. The next step is markets with several outcomes, like “Which team wins this match?”, where viewers buy stakes in Team A, Team B, or any other option, with prices that always add up to 100%. The LMSR pricing I already use generalizes to any number of outcomes, so this is an extension of the engine and not a rewrite.
- More event-based markets from EventSub (raids, subs, stream milestones), where Twitch’s permissions allow.
- A separate bot account and an easy onboarding flow so any streamer can add it to their channel.
- Seasonal leaderboards and persistent stats across streams.
- Stronger anti-abuse, such as account-age checks for activity markets.
- An optional Twitch Extension, so viewers can trade without typing commands.
Built With
- asyncio
- codex
- python
Log in or sign up for Devpost to join the conversation.