Bracket

Phase de poules d'un tournoi : rondes du groupe A avec le terrain, l'horaire et le score de chaque match.

Poules, tableaux et rondes suisses sur une instance à soi

Bracket est une application web de gestion de tournois, à installer sur son propre serveur. Un tournoi s'y découpe en étapes successives, par exemple des poules en round-robin puis un tableau à élimination directe, et un tableau de bord public suit les scores et les classements. Le backend est en Python asynchrone (FastAPI), le frontend en React avec Vite et Mantine, la base en PostgreSQL.

Appariements suisses tirés des scores de la ronde précédente

  • Formats combinables : élimination directe, round-robin et système suisse. Chaque étape contient un ou plusieurs groupes ou tableaux, et les qualifiés passent à l'étape suivante : une phase suisse peut déboucher sur un tableau final.
  • Suisse dynamique : les rencontres d'une ronde suisse sont créées à partir des résultats des rondes précédentes. Une équipe marquée inactive n'est pas programmée à la ronde suivante.
  • Planning en un clic, retouches à la souris : un bouton attribue un terrain et une heure à tous les matchs non programmés, puis un match se déplace au glisser-déposer vers un autre terrain ou horaire. Durée des matchs et pause entre deux matchs se règlent aussi match par match.
  • Barèmes de classement réglables : points pour une victoire, un nul ou une défaite, avec l'option d'ajouter le score des matchs au classement. Un tournoi peut porter plusieurs barèmes.
  • Tableau de bord public : chaque tournoi a sa page, à l'adresse choisie et avec un logo, conçue pour être montrée au public. Elle reste privée tant que l'option de visibilité n'est pas activée.

Équipes obligatoires, PostgreSQL et une 3.0 en release candidate

Le projet dit combler un manque. Selon sa documentation, GitHub ne compte aucun système de tournoi open source complet, et les solutions fermées sont en général payantes et chères. Elle ajoute que les outils de système suisse connus de l'auteur ne gèrent que ce format, ce qui empêche d'ouvrir par des rondes suisses et de finir sur un tableau à élimination directe.

Tout passe par des équipes. Les joueurs sont facultatifs et ne servent qu'à l'affichage. Pour une compétition individuelle, la documentation conseille de créer une équipe au nom de chaque participant, sans joueur dedans. Un terrain peut de même être un court de badminton ou toute ressource dont un match a besoin, comme une carte dans un jeu en ligne.

PostgreSQL est obligatoire, et l'API et l'interface sont deux pièces distinctes. Le frontend est un site statique Vite qui appelle l'API : s'il est servi depuis une autre adresse, il faut renseigner VITE_API_BASE_URL d'un côté et CORS_ORIGINS de l'autre. Avec la 3.0, SERVE_FRONTEND fait servir les deux par FastAPI sur un même domaine, et l'API passe alors sous /api. En production, la documentation exige un JWT_SECRET et des identifiants d'administrateur changés ; ALLOW_USER_REGISTRATION coupe l'inscription libre.

La dernière version stable, la v2.2.5, date du 8 août 2025. La v3.0.0-rc1, publiée le 29 décembre 2025 comme pré-version, passe le frontend de Next.js à Vite et renomme les variables NEXT_PUBLIC_* en VITE_*. Aucune 3.0 finale n'a suivi au 27 octobre 2026, alors que le README de la branche master la décrit déjà. La page de configuration dit le projet encore en bêta. En 2026, 341 des 356 commits de master sont des mises à jour de dépendances par Dependabot.

Un correctif de sécurité n'existe que sur master. Fusionné le 14 avril 2026, le correctif du contrôle d'accès aux tableaux de bord empêche de lire sans être connecté les équipes, terrains, classements et étapes d'un tournoi dont le tableau de bord n'est pas public. Le code des v2.2.5 et v3.0.0-rc1 ne fait pas cette vérification, et l'image ghcr.io/evroon/bracket:latest est celle de la v3.0.0-rc1 : pour avoir le correctif, il faut construire Bracket depuis master.