Skip to content
All projects

Le spot 3.0

A real-time multiplayer games platform, built for the phone: cards, dice, chess, solitaire and a racing game. A nickname and a PIN, no sign-up. Empty seats fill up with bots, including one trained by self-play.

Game
In progress
2026
depuis août 2026
  • Next.js
  • TypeScript
  • FastAPI
  • WebSocket
  • PyTorch
  • NumPy
  • PostgreSQL
  • Tailwind CSS
  • Three.js
  • Stockfish
  • PWA
Le spot 3.0

It started as a card game I play with my friends, one nobody had put online: Nine to One. It became the first game of a platform. You enter a nickname, create a table, share its code: no sign-up, nothing to install, the address opens in the phone's browser and the game starts. The nickname and PIN keep your stats from one session to the next.

The games

Six so far. Nine to One, Goulag and Perudo are played with others around a table. Solitaire is played alone, against the clock, and the server deals the cards and checks the win. Chess has an Elo rating, Stockfish bots from 800 to 2500 running in the browser, and a game analysis at the end. RT1 is a time trial race set in New Caledonia, still in beta. Each game has its own stats and leaderboard, under the same nickname everywhere.

Real time

Each table lives in the server's memory and talks to the players over WebSocket. The server is the only referee: it applies the rules, works out the legal moves and only sends each player what they are allowed to see. The client has no game logic, it displays a state and sends intentions.

The rules engines are covered by tests. A card game is above all a long list of special cases, and each one ended up with its own test after it caught me out in a real game.

The bots

Three levels in Nine to One. The first plays a random legal move, the second follows a hand-written heuristic, the third is a neural network trained by self-play with reinforcement learning, then exported to NumPy so it runs in production without PyTorch. When it's its turn, it completes its decision with a search over the cards it can't see.

This bot doesn't cheat: it gets exactly the view of a player sitting in that seat. It thinks in a separate thread, with a bounded time budget, so the network loop keeps serving the other tables in the meantime. The whole process fits in 75 MB, network weights included, on a VPS shared with my other sites.

Adding a game

Nickname, tables, chat, reconnection, timer, rematch and stats are shared. A new game only writes its rules, what each player sees, and its screens.