Inspiration The idea hit during the 2022 World Cup. 80,000 people in one stadium and the only tools we had were static signs and 20-minute bathroom lines. Vendors were guessing demand, fans were missing goals, and operations was flying blind.
For FIFA 2026, we wanted to build the MARACAÑÃ STADIUM COMMAND DECK — a real-time nervous system for the venue. One screen that lets fans find beer in 3 minutes, vendors prep for surges before they happen, and ops see density per section.
The name StadiumSurgeSync comes from the core loop: detect a surge, then sync every stakeholder to respond.
What it does StadiumSurgeSync is a real-time AI ops dashboard for stadium events.
For Fans: Natural language Fan Deck. Ask “beer in Section East, fast” and get the exact stand, live wait time, and a route. Ask “bathroom <5 min” and avoid halftime chaos.
For Vendors: Vendor Kiosk gets surge alerts + prep recs. Example: “Density in West is 56%. Prep 80 refreshments, 100 tacos.”
For Ops: Live Grid Activity Map shows density per section. Multi-agent loop writes events to MongoDB when thresholds are crossed.
Brazil vs France, 74’, 1–1. West section hits 56% density → Fan gets routed to 3-min beer line → Vendor gets prep alert.
How we built it Stack
- Frontend: React Native + Expo for cross-platform mobile
- Backend: http://Node.js + Express
- AI: Gemini 3 Flash for Fan Deck, Vendor Kiosk, Fantasy Coach agents
- Database: MongoDB Atlas with Triggers + Change Streams for real-time sync
- Deployment: In-Memory Cluster Sandbox for demo speed
Architecture
- Telemetry: Simulated crowd sensors push section density to
live_eventscollection - Threshold Logic: MongoDB Trigger fires when density > 55% \text{Alert} = \begin{cases} \text{True} & \text{if } \text{Density}_{section} > 0.55 \ \text{False} & \text{otherwise} \end{cases}
- Multi-Agent Loop: Gemini agents read the event, generate fan guidance + vendor prep instructions
- Sync: Change Streams push updates to all clients <200ms. Fan sees 3-min wait. Vendor sees prep rec.
Data Model
live_events — 50 docs of real-time matches, minutes, scores, attendance
vendors — 8 docs with location, capacity, catalog, live wait times
Challenges we ran into
- Noisy demo environment: Recorded 3 separate clips in a loud room. Audio was unusable. Fixed it by focusing on screen record + captions. Added pinned comment to clarify “StadiumSurgeSync”.
- Latency vs accuracy: Real-time means nothing if the beer line moved while you walked there. We solved it with MongoDB Change Streams + optimistic UI. Updates hit the app in ∼180ms.
- Hallucinated vendors: Early Gemini responses invented stands that didn’t exist. We grounded all prompts with actual
vendorscollection data. Now it only routes to Carioca Brew Stand 4E because it’s in the DB. - Threshold tuning: 50% density was too noisy, 60% was too late. Landed on 55% after testing: \text{Optimal Threshold} = \mu_{density} + 1.2\sigma \approx 0.55 That catches surges 2–3 minutes before queues form.
- YouTube UI hell: Couldn’t find Share button to get the link. Learned the “open video first, then Share” flow. Submitting a hackathon teaches you everything.
What we learned
- Real-time is a UX problem, not just a DB problem. 200ms updates are useless if the fan doesn’t trust the 3-min wait time. We added “Updated 12s ago” to build trust.
- Multi-agent > single chatbot. Fan, Vendor, and Fantasy agents need different context. A beer query shouldn’t see fantasy stats.
- MongoDB Triggers are OP for ops. Writing business logic at the data layer means every client stays in sync without polling.
- Ship > perfect. Our first demo had wrong captions and no audio. We still shipped because the core loop worked: sense → alert → action.
What’s next
- Real sensors: Integrate with WiFi access point counts + POS data instead of simulation
- Predictive surges: Use historical minute + score data to predict 70’ bathroom rush before it happens
- FIFA 2026 pilot: Talking to 2 host committees about Maracanã and MetLife trials
Built for fans who want to watch the match, not wait in line.
Log in or sign up for Devpost to join the conversation.