5 services
Django, Node and Flask
Socket.IO
Turn, lobby and bracket sync
Team of 5
42 capstone, I was PO
Overview
Tic-Tac-Toe Arena is the 42 capstone: a competitive platform where players match against each other or against an AI, earn XP, climb a leaderboard, run tournaments, and chat while they wait. It runs as five application services — Django for auth, Node and TypeScript for game and chat, Flask for the two AI services — behind an Nginx gateway with ModSecurity and TLS, orchestrated by Docker Compose with HashiCorp Vault holding every secret.
I was Product Owner and built the game backend end to end: the engine, matchmaking with direct friend invitations, the tournament system and its bracket engine, the leaderboard, and the dashboard. The game was never the hard part — tic-tac-toe is nine squares. The hard part was making a socket connection that can drop at any moment behave like a reliable transaction. A player who closes their laptop mid-match has to come back and find the board where they left it, and a tournament with a disconnected player still has to advance.
What it does
- 01Real-time 1v1 matches with synchronised turns over Socket.IO
- 02Matchmaking with direct friend invitations, and disconnect / reconnect recovery mid-match
- 03Tournament system: bracket generation, seeded players, and an engine that advances rounds as matches resolve
- 04Global leaderboard with per-player statistics and full match history
- 05Dashboard aggregating XP, recent results and standing
- 06Postgres persistence through Prisma for games, lobbies and tournament state
- 07A Q-learning AI opponent and an LLM chatbot, each isolated in its own Flask service
- 08Nginx reverse proxy with TLS termination and a ModSecurity WAF on the OWASP Core Rule Set
