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
Share this project:

Updates