Romain Cournol

← Accueil BuildBattle

Vingt minutes, un brief imposé, un serveur qui ne fait confiance à personne.

Rôle
Conception et développement
Année
2026
Stack
Durable Objects · WebSocket · React 18
Statut
MVP déployé · pas encore jouable en ligne
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.

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.

01 Le problème

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.

02 Ce que j’ai construit

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 et refuse explicitement de le tirer depuis l’identifiant de la partie : 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 début, puis de pré-construire.

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é.

03 Ce que j’en retiens

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.

La faille du tirage de brief était fermée avant qu’un seul joueur ne joue.

01

Arbitrer

Le serveur tient l’horloge et les cinq phases. Le navigateur affiche, il ne décide pas.

02

Figer

Les octets publiés sont figés à la soumission : une édition tardive ne change pas ce qui a été voté.

03

Sceller

Les compteurs de votes ne sont jamais diffusés avant la phase de résultats.

Résultat

321tests unitaires, plus un test de fumée sur de vrais WebSockets

  • 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
  • En mode classé, le brief est tiré d’une graine privée, jamais de l’identifiant de la partie