Inspiration
Scheduling is one of those tiny workplace problems that somehow eats entire afternoons. We wanted to make that pain visible, funny, and useful by turning calendar negotiation into a live AI-powered fight: two personas, two real calendars, one dramatic verdict.
What I Built
Calendar Combat is a scheduling game where two people connect Google Calendar, pick fighter personas, set priorities, and watch AI agents negotiate a meeting time in a live arena.
The app uses real calendar availability, streams the negotiation in real time, generates commentary, and ends with an AI judge recommending whether to schedule the meeting.
How I Built It
I built the project with Next.js, React, TypeScript, and Tailwind CSS. Google OAuth connects users’ calendars, the Google Calendar API checks availability, Gemini powers the main AI negotiation. Pusher handles realtime arena updates between participants. The UI was all designed with the help of Stitch and without it I don’t think I would’ve been able to design such a beautiful UI.
The basic flow is:
$$ \text{Connect Calendar} \rightarrow \text{Pick Persona} \rightarrow \text{Set Priorities} \rightarrow \text{AI Negotiation} \rightarrow \text{Verdict} $$
Challenges
The hardest part was making the live AI fight feel reliable. Streaming model output, syncing two browsers, handling rate limits, and keeping the UI responsive all had edge cases. We also had to build fallbacks so the arena would not collapse if an AI provider failed mid-fight.
Another challenge was balancing comedy with usefulness. The experience needed to be entertaining, but still grounded in real calendar conflicts and meeting constraints.
What I Learned
We learned a lot about building realtime AI experiences: model calls fail, streams can return empty, users refresh pages, and multiplayer state needs careful handling. We also learned that even a boring workflow can become engaging when the interface makes the hidden negotiation visible.
Most importantly, we learned that productivity tools do not have to feel sterile. They can be useful, expressive, and a little absurd.
Built With
- github
- gmail-api
- google-calendar-api
- google-chat-webhooks
- google-gemini-api
- google-oauth
- javascript
- local-json-storage
- next.js
- node.js
- npm
- pusher
- react
- render
- tailwind-css
- typescript
- xai-api
Log in or sign up for Devpost to join the conversation.