All projects
SIDE PROJECT / Beta

Koinon Games.

Synchronous tabletop games for groups, cells and friends.

TECHNICAL STACK8 technologies mapped
  • 01React
  • 02Vite
  • 03TypeScript
  • 04Node.js
  • 05Fastify
  • 06Socket.IO
  • 07Tailwind CSS
  • 08PWA
SYSTEM MAP

How the project holds together

A compact view of the technologies behind the experience, grouped by the role they play in the product.

01

Interface

  • React
  • Vite
  • Tailwind CSS
02

Runtime

  • Node.js
  • Fastify
  • Socket.IO
03

Delivery

  • PWA

Overview

Koinon Games is a digital tabletop platform for groups that want to play together without carrying a deck of cards or remembering to bring a game. The name comes from koinon, communion: the product is about making a shared activity easy to start. Anyone with a phone can join a room through a QR code or room ID and play over the internet. The initial audience was churches and friend groups, but the product is designed for any group. The first games are O Judas, where disciples identify the traitor through secret words, and Os Fofoqueiros, where believers protect secrets while saboteurs try to disrupt missions.

What it does

  • 01O Judas: a social-deduction game in which disciples use secret words to identify the traitor.
  • 02Os Fofoqueiros: a trust-and-betrayal game in which believers protect secrets and gossipers sabotage missions.
  • 03Rooms that can be joined from the home screen with a QR code or room ID.
  • 04Synchronous rooms with real-time player and game-state updates.
  • 05Mobile-first PWA interface designed for use during an in-person gathering.
  • 06Christian and non-Christian themes, depending on the group's preference.
  • 07Shared TypeScript types for players, rooms, themes and Socket.IO events.

Why I built it

The product removes the friction of bringing a physical game: if everyone has a phone and internet access, the group can start playing anywhere.

The original audience was churches and friend groups, but the underlying format is useful for any group that wants a shared game without a moderator carrying all the materials.

The product direction, game design and decisions about the experience were mine; coding agents accelerated the implementation inside a private monorepo.

More than a prototype on paper.

More than 50 people have already played across 100+ games. The product is still in beta, but the core loop—join a room, synchronize a group and play on phones—has been tested in real gatherings.

How it’s built

  • 01The web app uses React, Vite and TypeScript, with Tailwind CSS for styling and PWA support for offline-capable experiences.
  • 02The backend uses Node.js, Fastify and Socket.IO for HTTP endpoints and real-time game communication.
  • 03A pnpm-workspaces monorepo keeps the web app, server and packages/shared together.
  • 04The shared package defines the contracts used by both sides, including Player, Room, Theme and GameEventMap.
  • 05Rooms live in server memory and expire after enough inactivity, avoiding accounts and persistence while keeping active games simple.
  • 06Validation protects against repeated or out-of-order events, while a reconnection tolerance gives disconnected players time to return.
  • 07The hardest engineering work was handling different connection conditions and keeping controls usable across different phone sizes.
  • 08The frontend is deployed to Vercel and the backend runs on Railway, with CORS, environment secrets and production configuration kept in the respective platforms.
  • 09There is no monitoring or health-check layer yet because the beta is still small; the current priority is fixing edge cases found in playtests.

Deliberate limits

  • The repository is private.
  • The product is in beta and still receives fixes as new gaps are found, especially around connectivity and responsive controls.
  • The first release focuses on O Judas and Os Fofoqueiros; the game catalog can grow later.
  • The platform is designed for synchronous groups rather than asynchronous matchmaking.
  • Rooms are held in server memory and there are no accounts or persistent player profiles; only a chosen name and local preferences remain on the device.