Project

Quinline

A real-time multiplayer card and board game. Form a line of five coins before your opponents do. Strategy, luck, and the occasional friendship test included.

quinline.sachinkukreja.dev 2 to 3 players TypeScript · Python
Next.js Django WebSockets Redis PostgreSQL TypeScript Beta

Most board games live in a box under the bed, waiting for a rainy Sunday. I wanted to build something that could be played any time, with friends in different cities, without needing to be in the same room. Quinline started as that idea and grew into a full real-time multiplayer game built from scratch.

The game itself is inspired by the classic card and board game Sequence. Each player holds a hand of cards. Each card maps to a position on the board. Play a card, place your coin. The goal is to form a line of five coins before your opponents do. Simple to explain, genuinely hard to master.

The name

QuinLine comes from "quin" meaning five, and "line" for the row you are trying to form. Five in a line. That is the whole game.

How to play

Setup

Create or join a room

One player creates a game and shares the room code. Others join with the code. The game starts automatically once everyone is in.

Your turn

Play, place, draw

Select a card from your hand, click the matching board position to place your coin, then draw a new card to end your turn.

Special cards

Jacks change everything

Two-eyed Jacks are wild and can go anywhere. One-eyed Jacks remove an opponent's coin. Corner spaces are free for everyone.

Winning

Five in a row

Form a line of five coins horizontally, vertically, or diagonally. Two players need two quinlines to win. Three players need one.

How it is built

The real challenge in building a multiplayer game is keeping every player's screen in sync without delay. A player placing a coin needs to appear on all other screens immediately. That ruled out polling and pushed the architecture towards WebSockets from the start.

Frontend Next.js with TypeScript. Game board, card hand, and real-time state updates all rendered client-side.
Backend Django with Django REST Framework for the API and Django Channels for WebSocket handling.
Real-time Redis as the channel layer for WebSocket message brokering across connections.
Database PostgreSQL for persisting game state, room data, and player sessions.
Process PM2 for process management in production, keeping both the Next.js and Django processes running reliably.

The trickiest part was managing game state consistently across multiple clients. Every move needs to be validated server-side before being broadcast, so a player cannot cheat by sending a fabricated board position. The server is the source of truth and the clients only render what they receive.

Quinline is currently in beta. If you want to try it with a few friends or have feedback on the game mechanics, reach out or open an issue on GitHub.