Inspiration
We loved Gartic Phone and the unexpected result of friends building a story one line at a time and watching it spiral. But the payoff was always just text on a results screen. We thought, what if, instead of a recap, the game ended with a real visual novel style scene that pictures the exact ideas you and your friends thought of?
What it does
Kongroo is a 4-player collaborative storytelling game with an AI-illustrated payoff. Players spin up a room with a 6-character join code, take turns writing one line of dialogue at a time, and watch the story compound. When the round ends, the full story is shipped to a multimodal model that generates a visual-novel scene — an illustration in the painterly VN tradition, with the players' dialogue rendered into a classic translucent VN text panel composited over the image. The result is a shareable visual novel frame born from your friends' collective chaos. No accounts. No setup. Open the link, pick a name, you're in.
How we built it
- Frontend: React 19 + Vite, deployed on Vercel. Lobby, story-input, and reveal pages
handle the game flow. - Backend: FastAPI on Railway with an in-memory room manager (4-player cap, automatic
host migration on disconnect, case-insensitive room codes) and a WebSocket endpoint
that broadcasts room state to every connected client on join/leave. - AI: Gemini's image-generation Flash model, prompted with a tight visual-novel system
prompt that forbids in-image text so we control typography ourselves.
- Image composition: Pillow draws the soft-blue VN dialogue panel — semi-transparent
rounded rect, word-wrapped story text, cross-platform font fallbacks — directly onto
the model's output. - Session model: Client-generated UUID + display name persisted in localStorage. No
auth. No database. Just identity, just enough. - Tests: 29-case pytest suite over the room manager and REST endpoints — host
migration, full-room rejection, idempotent rejoins, the works.
Challenges & what we learned
- Vite 8 + Vercel Node version mismatch. Vite 8's new Rolldown bundler refused to build on Vercel's default Node 18. The error was buried four stack-frames deep in a Rolldown internal. Pinning Node 22 with .node-version fixed it instantly — and reminded us that the longest debugging session can collapse into a one-line config when you finally find the right log line.
- A real-time game without a database. We originally scoped Supabase Realtime +
Postgres + Auth. Mid-hackathon we pulled all of it. Plain WebSockets and a Python dict
turned out to be enough — every persistence layer you don't ship is a deployment
surface you don't have to debug.
- A merge conflict that taught us coordination. Two of us evolved schemas.py
independently — one toward session-aware Gemini chat history, the other toward room
management. The rebase forced an architecture conversation we should have had three hours earlier. - Multimodal models respect strong style constraints. Our visual-novel images only
became consistent once we aggressively constrained the system prompt and explicitly
forbade in-image text. The model is happiest when you give it one job.
What's next for Kongroo
- Persistent gallery. Save every generated scene to a public feed so finished stories
live on past the room. - Multi-panel storyboards. Instead of one final frame, render a 4-panel manga page
where each player's line gets its own panel — closer to a real comic, closer to the
magic of seeing your specific contribution illustrated. - Voice mode. Speech-to-text input so the chaos happens at the speed of conversation.
- Style voting. Let rooms pick the aesthetic — shoujo, dark fantasy, Ghibli, gritty
seinen — before the game starts. - Persistent rooms. Optional friend lists and saved room codes so groups can pick up
where they left off.
Built With
- fastapi
- pydantic
- python
- railway
- vercel
- vite


Log in or sign up for Devpost to join the conversation.