← Accueil
ProjetProjet personnel · 2026

BuildBattle

Deux à huit joueurs, le même brief, vingt minutes, et une partie construite pour tenir face au joueur qui ouvre les outils de développement.

5 phaseslobby, build, showcase, vote, résultats, toutes arbitrées par le serveur
Cloudflare Durable ObjectsWebSocketSupabaseReact 18TypeScript
BuildBattle en phase de construction : la barre de phases lobby, build, showcase, vote, résultats ; le brief tiré pour la partie, « Magic 8-Ball » ; le chronomètre tenu par le serveur à 26 secondes du verrouillage ; et les contraintes imposées à tous les joueurs.
01

Contexte

Les jeux vidéo sont une passion. Le format des Beat Battles m’a plu, je l’ai transposé au build.

Le vibe-coding se pratique seul, sans horloge et sans juge. J’ai voulu voir ce qu’il en reste avec un brief imposé, un chronomètre partagé et un vote.

02

Par où ça casse

Un jeu compétitif en temps réel se casse par son client : si le navigateur porte l’horloge ou le choix du brief, le premier joueur curieux ouvre les outils de développement et gagne.

03

L’état côté serveur

Chaque partie vit dans un Durable Object Cloudflare, avec son timer d’alarme côté serveur. Le SPA React affiche l’état, il ne le produit jamais.

La décision dont je suis le plus content ne se voit pas à l’écran. En mode classé, le serveur tire le brief depuis une graine privée (crypto.randomUUID) et refuse explicitement de le tirer depuis l’identifiant de la partie. La raison est écrite dans le code : cet identifiant est renvoyé à l’hôte, et la fonction de tirage est embarquée dans le bundle du SPA. Seeder depuis l’identifiant, c’est permettre à l’hôte de recalculer le brief avant le START, puis de pré-construire.

04

Déployé, pas encore jouable

MVP déployé sur Cloudflare Pages et Workers le 25 juillet 2026. La boucle complète tourne en local, en démo solo contre deux bots.

Le service d’authentification hébergé est en pause : l’écran d’accueil répond en ligne, mais on ne peut pas encore créer ni rejoindre une partie.

05

Ce qui a été coupé

Trois périmètres ont été coupés pour tenir sur un plan gratuit : le pipeline payant de clips automatiques, la publication vers une URL externe, la galerie asynchrone. L’authentification par e-mail a été retirée au profit du mode invité.

Points clés

  • Les octets publiés figés à la soumission : une édition tardive ne change pas ce qui a été voté
  • Les compteurs de votes jamais diffusés avant la phase de résultats
  • 321 tests unitaires et un test de fumée qui joue trois joueurs et trois soumissions sur de vrais WebSockets
À retenir

En mode classé, le serveur refuse de tirer le brief depuis l’identifiant de la partie : l’hôte connaît cet identifiant et la fonction de tirage part dans le bundle client. La faille était fermée avant qu’un seul joueur ne joue.

Autres réalisations