Every CrossFit Games preview is an opinion. I built one that is not.
Every CrossFit Games preview you will read this month is somebody's opinion. A coach you trust tells you who looks strong, you nod, and you have no way to check the work. I wanted the opposite: a projection where every number traces back to a real result, and where I can show you exactly which workout produced it. So I built one for the 2026 field.
This rides on a tool I already run. wod.persistenceathletics.com is a static React app that analyzes 6,800+ CrossFit Workouts of the Day from crossfit.com going back to February 2001, served by Caddy as plain files with no server behind it. This week I added a 2026 Games layer on top: data-grounded athlete profiles, a projected leaderboard, and a what-if simulator.
The shape
One build step pulls every athlete's competition record and computes a profile deterministically, then the site loads it as static JSON. The cohort is the full field of 81: the 46 athletes already qualified, 23 men and 23 women out of the in-person Semifinals, plus 35 contenders still fighting for the last spots that lock this week. 42 of them have self-reported benchmarks on their Games profile, so the engine uses those too. The stack is Vite 8, React 19, and TypeScript, with the whole intelligence layer reduced to JSON at build time. No API answers at runtime.
old: a Games preview is a hot take. someone you trust says who looks good and you nod.
new: every projection traces to a real placement. 81 athletes, scored on the events they actually did, no opinion in the pipeline.The engine does not have a take
An athlete's profile is 10 general physical skills, and each skill is a weighted mean of how that athlete placed, as a percentile of the field, on the events that actually test it. Strength comes from heavy and weightlifting events. The long engine comes from the medium and long time domains. The three energy systems come from the Gastin 2001 contribution curve, interpolated by how long the effort lasts. The season rank is a fixed blend: 50% current-season form, 30% decayed prior-Games form, and 20% a gentle age curve that peaks from 24 to 30.
The part I am most sure about is the one skill it refuses to guess. Flexibility has no signal in competition results, there is no range-of-motion data for the field, so the profile shows it as "not measured from competition data" instead of inventing a number. Every weight lives in one config file that both the build engine and the in-browser simulator import, so the two can never quietly disagree about what a workout demands.
A simulator that runs the same math
The what-if simulator lets you build a workout in the browser and see how the field would likely finish it. It is not a second model. It runs the exact math the build engine ran: an athlete's expected output is 0.6 of their measured placement on the events that tax those skills, plus 0.4 of how closely their skill vector matches the workout's demand. Measured results outrank similarity on purpose, because a real placement is stronger evidence than a resemblance.
You can read the results off the board. Colten Mertens tops the contender list on a field-best 555 lb back squat. Jeffrey Adler sits near the top on a 95th-percentile long engine and a 2023 title. I then wrote scouting reads in plain English for all 81, under one hard rule: a read is not allowed to say anything the numbers do not already say. A relative weakness is framed as relative, never as a hole that the data cannot support.
A news desk that refuses to write
The same principle runs the /news page. It is a verified aggregator with no LLM and no git in the loop. It pulls a fixed set of real feeds, dedupes against a ledger, and link-verifies every new article, which has to return 200 before it ships. The window is 35 days and a slow feed gets 30 seconds before it is dropped for the run. When the datacenter IP started getting a 403 from a couple of sources' CDNs, the pipeline dropped those sources rather than serving dead links. It surfaces real articles or it surfaces nothing.
What I learned
A projection people can audit beats one they have to trust. The whole point is that you can ask "why is this athlete ranked here" and get an event and a placement back, not a shrug. The clearest proof is the skill the engine leaves blank: Flexibility shows as not measured, because faking it would have been the one dishonest number on the page.
One config file beats two copies of the truth. The skill weights, the energy curve, and the 0.6 and 0.4 projection blend all live in a single file that the build step and the browser simulator both read. Two copies drift the first time you touch one and forget the other. One copy cannot.
A verified aggregator is allowed to publish nothing. The news desk synthesizes zero facts and link-checks every story before it runs. When two sources started blocking the server, the right move was to drop them, not to paper over the gap with stale links. Refusing to fabricate is a feature, not a limitation.
If you have a pile of real data and you want a tool that reasons from it without making anything up, that is what Autosterea builds.
First published on ravikantdewangan.com.


