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.

La page d’accueil de Scoredly Open : « Organisez l’Open dans votre salle » avec classements, suivi des scores et prédictions — présentée avec une salle de démonstration remplie de données d’exemple.

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.

Un classement de salle sur un téléphone : des athlètes classés avec des scores par épreuve pour les trois épreuves de l’Open. Données de démonstration.
le tableau sur un téléphone de plancher de salle — salle et athlètes de démonstration

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.

Le classement de démonstration Iron Athletics : des athlètes classés sur l’Open 26.1, 26.2 et 26.3 avec répétitions, temps, étiquettes Scaled et Foundations, fenêtres de soumission et points.

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.

open.scoredly.comle classement de la salleL’athlète soumetscore · juge · preuve photoL’admin approuveou refuse, avec un motifClassementpointage de la salle, plus lerang mondial prédit par athlètescoresapprouvésrangspréditsservice de synchronisationun petit conteneur sans étatRéveil horaireactif seulement pendant unefenêtre de soumission ouverteMoteur de prédictionplace chaque score sur unecourbe score-rangClassement officielAPI publique~300K lignes par divisionpagesprélevéescomportement non officiel,rétro-conçu etdocumenté correctement
L’application de la salle n’appelle jamais le classement officiel. Un petit service sans état le fait — chaque heure, seulement pendant qu’une fenêtre de soumission est ouverte — et renvoie le rang mondial prédit de chaque athlète.

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.

rang 1~300Krangmondialscore (mieux →)chaque point : une pagedu classement officielle score d’un athlète de sallerang prédit — interpoléentre les deux ancrages proches
Quatorze pages plutôt que trois cent mille lignes : des pages régulièrement espacées deviennent des ancrages score-rang, et chaque athlète se place entre les deux plus proches. Au-dessus du meilleur ancrage, on arrondit au rang 1 ; sous le pire, on extrapole, plafonné à la taille du peloton.

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

C’est ainsi que nous exploitons nos propres produits

Les mêmes standards s’appliquent au travail client — des projets à portée fixe ou des blocs prépayés d’heures d’ingénierie infonuagique, réseau et sécurité.