Produits que nous exploitons
Scoredly Open
Organisez l’Open dans votre salle, gratuitement : les athlètes soumettent leurs scores, les admins les approuvent, et le classement affiche le chiffre que tout le monde veut vraiment — où ce score se situe à l’échelle mondiale.

- 18divisions, à l’image du peloton officiel
- 1entier classe chaque type de score
- ~300Klignes par division que nous ne téléchargeons jamais
- chaque heuresynchronisation — silencieuse hors des fenêtres de soumission
Le problème
Trois semaines par année, des milliers de salles deviennent des sites de compétition. La plupart s’en remettent à un tableau blanc.
Chaque année, le CrossFit Open transforme des salles ordinaires en planchers de compétition : trois épreuves, des scores jugés et un peloton mondial. Dans la salle, cela se résume habituellement à un tableau blanc et à un tableur — et la question que chaque athlète pose en premier, où mon score se situe-t-il à l’échelle mondiale ?, n’a aucune réponse à l’échelle de la salle. Nous en avons bâti une, et l’avons rendue gratuite pour les salles.
Ce que nous avons bâti
Un classement pour la salle, un service de synchronisation pour le monde, et une documentation pour l’API que personne n’avait documentée.
Le classement, c’est là que vit la salle : les athlètes se connectent par lien magique, s’inscrivent eux-mêmes et soumettent chaque score avec le nom du juge et une preuve photo facultative. Un admin approuve ou refuse chaque score — avec un motif — avant qu’il ne compte. Le pointage suit exactement la méthode du vrai événement (une épreuve manquée coûte la dernière place plus un), sur les dix-huit divisions officielles et les trois paliers d’adaptation, en cinq langues, rapide sur un téléphone brandi entre deux séries.
Le service de synchronisation est un conteneur distinct et sans état avec une seule tâche : donner à chaque athlète un rang mondial prédit. Une fois par heure — et seulement pendant qu’une fenêtre de soumission est réellement ouverte — il récupère les scores approuvés de la salle, échantillonne le classement officiel, et renvoie au tableau le rang prédit et le centile de chaque athlète.
La référence est née de la construction des deux : l’API du classement officiel est publique mais non documentée, alors nous l’avons rétro-conçue et couchée sur papier correctement — encodages des scores, règles de bris d’égalité, divisions, où réside réellement chaque type de donnée — en une référence autonome, pour que le savoir survive à n’importe quel service.

Le tableau lui-même
Vrai produit, données remplacées : une salle de démonstration remplie de données — jamais de vraies salles ni de vrais athlètes.

Un seul tableau porte tout l’événement : temps, répétitions, fins plafonnées et étiquettes d’adaptation se classent côte à côte (c’est l’encodage sur un entier à l’œuvre), chaque colonne d’épreuve sait si sa fenêtre de soumission est ouverte, et les points s’accumulent exactement comme le vrai événement les calcule.
Comment ça fonctionne
L’application de la salle ne touche jamais au classement officiel. Un petit service s’en charge, prudemment.
La séparation est délibérée. L’application de classement s’exécute en périphérie et sert les salles ; le service de synchronisation est la seule chose qui parle à l’API officielle, avec une concurrence bornée et un rythme poli envers un système en amont qui ne nous doit rien. Il est conçu pour être ignoré : hors des fenêtres de soumission, il se réveille, ne voit rien à faire et se termine en silence. Pendant les fenêtres, une étape ratée nous alerte sur Telegram et une exécution manquée déclenche une surveillance externe. Personne ne le materne.
Le nœud du problème : un rang mondial sans télécharger le monde
Le classement d’une division fait ~300 000 lignes. Nous en récupérons quatorze pages.
Classer un athlète de salle par rapport au monde n’exige pas le monde — cela exige de savoir quels scores se situent à quels rangs. Le service de synchronisation échantillonne des pages régulièrement espacées du classement officiel (plus de pages pour le peloton Rx bondé, moins pour les paliers plus petits) et les transforme en une courbe score-rang. Le score de chaque athlète de salle est ensuite placé par recherche binaire et interpolé entre les deux ancrages les plus proches.
Décisions à souligner
- Un entier classe chaque type de score. Les temps, les répétitions, les fins plafonnées avec bris d’égalité et les charges sont tous encodés pour que « plus grand » vaille « meilleur » — tout le classement se trie avec un seul ORDER BY, sans cas particuliers par type susceptibles de mal tourner.
- Les paliers se classent comme au vrai événement. Chaque score Rx devance tout score Scaled, qui devance tout score Foundations — le même ordre absolu que celui du classement officiel, encodé plutôt que rapiécé après coup.
- Pages rendues au serveur, îlots d’interactivité. Le classement se lit surtout, alors le serveur rend le HTML et de petits îlots interactifs ne s’hydratent que là où ils le méritent. Il reste rapide sur un téléphone branché au Wi-Fi de la salle.
- Documenter le non documenté. Tout ce que nous avons appris sur l’API non officielle est devenu un document de référence autonome — un savoir durable plutôt qu’un savoir tribal.
- Conçu pour être ignoré. Sans état, surveillé, alerte en cas d’échec, silencieux quand il n’y a rien à faire. L’effort d’exploitation avoisine zéro cinquante semaines par année.
Réalisé avec
- Cloudflare Workers
- Hono
- htmx
- Preact
- D1