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

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.