Back to work
École 42 · Final project · 2025

ft_transcendence

Real-time multiplayer pong with tournaments, matchmaking, friends system and chat — École 42 Paris' final project. The one where you learn to hold an entire full-stack system in your head at once.

TypeScript NestJS WebSockets Docker PostgreSQL OAuth 2.0
Challenge

Rebuild real-time multiplayer Pong with tournaments, 2FA auth, matchmaking, friends system and chat — 42 School final project.

Approach

NestJS + TypeScript backend with WebSockets for real-time gameplay, PostgreSQL for persistent state, Docker for orchestration, Fastify + Vite on the front.

Outcome

Peer-review validated against 42 standards, deployed, playable online. Codebase kept audit-clean for the jury.

01Context

The capstone at 42

ft_transcendence is the final capstone at 42. It bundles: real-time multiplayer game, OAuth with 2FA, social graph (friends, invites, chat, blocks), tournaments with brackets — all Docker Compose-containerized with a PostgreSQL backbone. Constraint: no client-side framework that does the heavy lifting for you.

02What I built

The game, the social layer, the infra

  • Real-time pong — server-authoritative game engine, 60fps WebSocket sync, client-side prediction, server reconciliation.
  • Tournaments — single-elimination brackets, auto-matchmaking between registered players, progression tracked in DB.
  • Social graph — friends, invites, real-time chat, user blocking, private rooms.
  • OAuth + 2FA auth — 42 OAuth login, optional TOTP 2FA, JWT sessions with refresh tokens.
  • Docker Compose infra — frontend, NestJS backend, PostgreSQL, reverse proxy. One command spins up the whole environment.
03What I took away

The end-to-end view

For the first time, I had to reason at once about network latency, DB concurrency, cross-client consistency, game session lifecycle, and new-user onboarding. It's the point where full-stack stops being "frontend + backend" and becomes one system whose internal boundaries you have to draw yourself.

This project is the foundation that makes every one after (la_carte_mobile, Élan, un-hopital-autrement) manageable solo. If you can hold ft_transcendence in your head, you can ship an MVP.

04Stack
TypeScriptEnd-to-end
NestJSBackend, modules, DI
WebSocketsReal-time sync
PostgreSQLRelational database
Docker ComposeLocal orchestration
OAuth 2.042 login
TOTP 2FATwo-factor auth