<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://perfectionkills.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://perfectionkills.com/" rel="alternate" type="text/html" /><updated>2026-08-29T17:35:58+00:00</updated><id>https://perfectionkills.com/feed.xml</id><title type="html">Perfection Kills</title><subtitle>Engineering and Fitness Musings by kangax</subtitle><author><name>kangax</name></author><entry><title type="html">The Great Experiment</title><link href="https://perfectionkills.com/the-great-experiment/" rel="alternate" type="text/html" title="The Great Experiment" /><published>2026-08-09T00:00:00+00:00</published><updated>2026-08-09T00:00:00+00:00</updated><id>https://perfectionkills.com/the-great-experiment</id><content type="html" xml:base="https://perfectionkills.com/the-great-experiment/"><![CDATA[<h2>The Great Experiment</h2>

<p>I had two and a <em>quarter</em> drinks in the last thirty days. </p>

<p>Before that, my normal month was around forty, and a bad one was closer to eighty. Ten on a weekend was easy, especially when you're up till 4am and in a good company, plus a glass or two here and there during the week — it adds up fast when you're not counting. I know the numbers now because I vibe-coded a little app to count them.</p>

<p>There was no rehab, no rock bottom, no announcement with a sunset photo. This writeup is mostly my attempt at untangling what happened, why the mindset shift, and how I got here.</p>

<h3>The equilibrium</h3>

<p>For twenty-smth years drinking wasn't a problem — it was a choice. At least that was the story I told myself. The more honest version is that there were two of me. The weekend Juriy wanted to dress up, go out, be seen, and descend into the madness with friends (that's genuinely what I called it, "descending into the madness together", and I meant it as a compliment). The Monday Juriy wanted to be great at training. <a href="/on-crossfit-open/">CrossFit was becoming an increasingly important part of my life</a>.</p>

<p>I spent years in talk therapy circling this exact tension and eventually filed it under "unsolvable, this is just my life". I wanted both. And to be clear — I wasn't confused about any of it. I knew the physiology: the sleep disruption, the recovery cost, all of it. But knowledge doesn't change anything when both sides of the scale weigh the same. I wasn't stuck because I lacked information. I was stuck because I was at <em>equilibrium</em>. </p>

<h3>The shackles joke</h3>

<p>I was the fittest guy among my friends, often top three on the gym leaderboard, and I had a running joke with a close friend: imagine how good I'd be without these weights on my ankles (referring to drinking).</p>

<p>My AI coach, annoyingly, pointed out what that joke actually was — a brag. As long as the shackles stayed on, the imagined version of me stayed safely imaginary and could never be tested. The chains weren't holding me back from finding out how good I could be. They were protecting me from finding out.</p>

<h3>The wake up call</h3>

<p>Then I signed up for HYROX NYC on a whim and it absolutely crushed me. My goal was 1:20-ish and I finished in 1:45. The fittest guy among his friends turned out to be bottom of the barrel among the fit fam at large. I knew very well that people who did better than me had one thing in common: they had better calendars. A race is built on a hundreds of hours of boring Friday-nights. My gym leaderboard was a small pond that gave me an illusion of fitness.</p>

<p><a href="/thoughts-on-first-xenom-in-dallas/">XENOM Dallas confirmed it a few weeks later</a>. Different format, same story: somewhat good on the strength events, exposed everywhere the engine mattered. The sample size was getting bigger and so was the elephant in the room.</p>

<h3>How we got here</h3>

<p>It wasn't just fitness stuff. Looking back I can see how things were already shifting for a while.</p>

<h4>Asia, the accidental experiment</h4>

<p>Every winter I'd escape to Asia (Chiang Mai, Da Nang) for a month or two. Officially for the weather; actually to escape New York's gravity — the party scene, the late nights, the whole Saturday machine. Yes, I was literally scheduling my sobriety so I can prioritize training.</p>

<p>Here's what's interesting: I still drank in Vietnam. One or two cocktails with lunch or dinner, most days, so the monthly total was probably not far off a New York month. But there were no binges. And my recovery scores went from red to yellow, training compounded week over week, and <a href="/overnight-success/#exhibit-b">I hit the best CrossFit Open of my life</a>. Same volume of alcohol, completely different delivery. The binge was the poison, and I had the data to prove it. I knew this well and was already planning South America for next February as the next engineered escape. Apparently I could only access the healthy version of my life by leaving my actual life.</p>

<h4>Vipassana</h4>

<p>Somewhere in there, <a href="/vipassana-through-the-modern-lens/">meditation</a> started shaking the foundation. I got better at watching the cravings as sensation and story — the being-looked-at loop, the dressing-up loop — and some of that magic disappeared and the stories revealed themselves as just that. Not all of it, but some.</p>

<h4>Aging</h4>

<p>Underneath everything, the physics changed. At 28 a bender cost me Sunday. At 40 it cost Sunday, Monday, and—annoyingly—most of the Tuesday. Same purchase, but the <em>invoice</em> kept growing. I'd love to claim pure spiritual growth here, but a big part of this is just a guy facing the inevitable truth about life.</p>

<h4>Community</h4>

<p>Then HYROX and XENOM showed me a room full of people who were intense, competitive, even vain — and none of it ran through Saturday night. Before that, not-partying looked to me like absence, the gray life of someone who gave up fun. Seeing <em>thousands</em> of people actually living it reframed the whole thing as a different kind of vivid. I guess I needed to see and feel this side of life for something inside of me to start shifting.</p>

<h3>Why do we drink?</h3>

<p>I never said "I quit" — that always felt too final, too binary. You declare zero-forever, then have half a drink at some wedding, and boom — complete failure, might as well keep going. I've seen that loop. So I just... kept the door open.</p>

<p>Then—two weeks into fully sober—during the World Cup I ordered an IPA at a bar, because I missed the taste. I drank a quarter of it and discovered, in real time, that the taste was the only thing I missed. I no longer wanted to be drunk. I left the rest on the bar and felt completely done — no regret, no negotiation.</p>

<p>Drinking is many things: flavor, ritual, occasion, intoxication, identity, a fix for a social anxiety — turns out I still cared about taste but intoxication? Not so much. The anxiety bit is definitely still there and is something to work on.</p>

<h3>Why not just moderate?</h3>

<p>This is the question everyone asks, and I asked it myself for years. Why not be a reasonable person — skip the binges, keep 1-2 cocktails at dinner?</p>

<p>Honestly, I'm still processing this part. The dinner glass was real — it tasted good, it felt good, it was part of a ritual so deep I didn't even know what it was for. It made conversations easier. None of that was delusion.</p>

<p>But here's what I noticed after the shift: most of what I liked was the ritual, not the alcohol. Sitting down, ordering something, the evening becoming an occasion — turns out a Topo Chico in a nice glass does like 80% of that job. The social part is the one real loss, I won't pretend otherwise. Without a drink it takes me longer to warm up at a dinner table, and some nights I feel that.</p>

<p>And the buzz itself? I just stopped enjoying it. That's the part I can't fully explain yet. But once being tipsy stopped feeling good, the cocktail had no job left to do. There was never a moderation battle to win — the thing I would've been moderating just wasn't there anymore.</p>

<h3>It's not dead, it's observed</h3>

<p>I gotta be honest, the drinking identity is still very much alive in me. Hence why this is a <em>great experiment</em>, not a eulogy.</p>

<p>I pass a bar, see people laughing over drinks, and there's an immediate flicker of memories and associations — twenty-smth years of mostly good times. Incredible times, in fact. I see an ad for a gorgeous Junmai Daiginjo and I can almost taste that delicate sweetness and flavor, plus all the labor and dedication that went into it. I'm not burying any of that and I don't want it to die. It sits there, I observe it, and some days I miss it the way you miss anything that was huge and formative and mostly fun.</p>

<p>The current policy is that taste stays and state goes. A few sips of serious red wine at a good Italian restaurant, handled the way you'd handle something potent — conscious, rare, deliberate. Not an every-weekend default. And you <em>never</em> need a 2nd drink.</p>

<h3>The Perks</h3>

<p>The body stuff, real quick, because this post isn't really about it: sleep got better fast, training feels easier, I'm more hydrated.</p>

<p>My watch tells the whole story in three colors. New York weekends were red. Da Nang was yellow — two cocktails a night kept it yellow, I just mistook yellow for green because I'd been living in red. Now I'm mostly green, and when it breaks (late dinner, short night) the reason is actual information instead of the same old suspect. </p>

<p>Removing alcohol didn't make me perfect; it removed the loudest variable so I could finally see the quiet ones. This alone is huge: I no longer wonder if upset stomach or bad sleep or shortness of breath or smth else is due to the booze. I can now tackle other life factors separately.</p>

<p>And then there's the money. Cocktails in New York run twenty-plus dollars now, and at my old pace the drinks total at dinner often exceeded the food one. </p>

<h3>Meeting your partner</h3>

<p>This is the part I didn't see coming. My partner doesn't drink — never has, she's allergic — and for years I'd pitch her on what she was missing. I'd explain that drinking with someone is descending into the madness together, both of you consciously boarding the same delusion, and that it's a real meeting point. I still think that's true, by the way. I won't pretend drunk connection is fake.</p>

<p>But it meant that at dinner, two drinks in, I was joking <em>at</em> her from a plane she couldn't board. I kept inviting her down into my madness, and it never occurred to me that the actual move was to come up to her sobriety.</p>

<p>Now we sit at the same table on the same frequency. The connection isn't one big descent anymore — it's dozens of small moments per dinner that used to get blurred over. I'm more present with her than I've ever been, and that alone might be worth the whole thing.</p>

<h3>Fuck fitness</h3>

<p>Fitness triggered all of this, it motivated me. But let's forget fitness for a second because there's something bigger here.</p>

<p>For twenty-smth years I told myself I was choosing fun, but you can't really choose when you can't say no. My Monday was powerless to my Saturday. My whole training life orbited around alcohol's aftermath, and I called that balance.</p>

<p>What I got back isn't a better 5K time, it's <em>choice</em>. I can enter any room, any wedding, any Saturday on any setting I want, including the old one. The door is still open. I just don't walk through it, and not wanting to is the actual superpower here.</p>

<p>I'm forty years old and I have never once seen my real ceiling. It feels like discovering an overclock setting on a GPU card I've been running under-clocked for years. Finding out is the whole point now.</p>

<h3>Worth trying?</h3>

<p>Look, I'm not recruiting. The other side can honestly be boring AF at first, while you learn how to "walk again". But if you've been drinking for years and never once stopped, I think the experiment is worth running. Thirty days, no "quitting" or anything, just to see what it feels like. You might meet a version of yourself you've never hung out with sober. You might even like them.</p>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Two and a quarter drinks in thirty days, down from about forty a month. No rehab, no rock bottom. How the equilibrium between drinking and training broke.]]></summary></entry><entry><title type="html">How do you rank in your CrossFit box?</title><link href="https://perfectionkills.com/how-do-you-rank-in-your-crossfit-box/" rel="alternate" type="text/html" title="How do you rank in your CrossFit box?" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://perfectionkills.com/how-do-you-rank-in-your-crossfit-box</id><content type="html" xml:base="https://perfectionkills.com/how-do-you-rank-in-your-crossfit-box/"><![CDATA[<h2>How do you rank in your CrossFit box?</h2>

<p>I've always wanted to know where I stand at my gym — not just today, on one or two workouts, but over <em>years</em>.</p>

<p><a href="/your-crossfit-app-doesnt-know-what-you-did/">As you might know</a>, I've been on a mission to create the best CrossFit app. This made me research a lot of the existing ones: SugarWOD, PushPress, and Wodify all show a <em>daily</em> leaderboard<sup id="footnote-anchor-1"><a href="#footnote-1">1</a></sup>. You do Fran, you see how you placed against whoever also did Fran that day. Fun for about ten seconds. Well, some of us are <s>nuts</s> competitive. We want rankings that represent overall fitness, which means aggregating many scores.</p>

<p>I decided to find out.</p>

<h3>Getting the data</h3>

<p>My first idea was gloriously dumb: point Claude at the SugarWOD app on my phone and have it scroll through leaderboards, screenshotting ranks one by one. Slow, fragile, but that's ok because an agent can chew through it in the background.</p>

<p>Opus surprised me with a better idea. SugarWOD's own web app talks to an internal API. Using my authenticated SugarWOD session, I could retrieve the gym results already available to me as a member. No screenshots and <em>much</em> faster. Claude knew this because I've experimented with some of the SugarWOD API to create a <a href="https://apps.apple.com/app/id6758307458">whiteboard in PRzilla</a>.</p>

<p>So I pulled all of our gym's (<a href="https://www.murderofcrowsbrooklyn.com/">Murder of Crows</a>) data. Men, women, RX, scaled. Every recorded score from November 14, 2017—the month my gym started logging—through July 20, 2026. 103 active months. Roughly 640 athletes. 117,236 individual scores. An absolute goldmine of performance data and athlete rankings.</p>

<figure><img width="1456" height="777" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/01.png"/></figure>

<p>I thought I was building a chart for an afternoon. A week of ruthless iteration later—questioning every number, removing more than I added, and simplifying it again and again—I had a clear view of nearly nine years of athlete progress.</p>

<p>You can play around with an anonymized version at <a href="https://przilla.app/moc">https://przilla.app/moc</a>. The public board uses stable aliases, while gym members have a private link that shows real names.</p>

<p>Click any dot to see the workouts behind that month.</p>

<figure><img width="1600" height="1093" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/02.png"/></figure>

<h3>The Rx and Scaled problem</h3>

<p>At first I split everyone cleanly: Rx on one board, Scaled on another. Seemed fair. Then I noticed what that hides. If one athlete does a workout Rx while twelve others scale it, the Rx board calls that athlete first out of one—a meaningless win. And no combined board gives them credit for attempting the prescribed version.</p>

<figure><img width="1206" height="2622" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/03.png" style="max-width:274px"/></figure>

<p>So I added a third view, "Overall." For this experiment, I used a simple, transparent Open-style rule: every Rx result ranks above every Scaled result; within each group, results are sorted by score.</p>

<p>Here's why it matters. Say five people go Rx and you land third. Ten more go Scaled, below all the Rx. On the old Rx-only board you're third of five — middle of the pack. In Overall you're third of <em>fifteen</em>, ahead of everyone who scaled. You go from roughly the 50th percentile to the top 20%.</p>

<p>Another fascinating problem: ~66% of the conditioning scores in my gym's history are scaled—39,556 of 59,743. You might scale Fran to 65 pounds and banded pull-ups while I use 95 pounds and jumping pull-ups, yet both results appear simply as "Scaled, 4:12"—despite representing very different workouts.</p>

<p>Most apps don't truly know how you scaled. SugarWOD saves a score and a note like "65#"; <a href="https://przilla.app/">PRzilla</a> records the movements and loads, so it knows you did jumping pull-ups and 65-pound thrusters. That gives us better inputs—65 pounds is 68% of Fran's prescribed thruster load—but it still cannot fairly compare different substitutions, loads, and finish times. This historical dataset does not contain enough detail to reconstruct them.</p>

<p>What about 80% of the prescribed load at 5:05 versus 60% at 4:05? One person did the harder version; the other was a minute faster. Is 20% more weight worth a minute? It depends on the workout and the athlete. Scaling also isn't linear: the difficulty gap between a 95 lb and 135 lb thruster isn't the same as that between 135 lb and 175 lb, despite the identical 40 lb difference. Performance can drop sharply as the load approaches an athlete's limit.</p>

<h3>Why percent beats rank</h3>

<p>Rank hides field size. Third of four means beating one person; third of forty means beating thirty-seven—about the 95th percentile. Percentile puts both results on the same scale, letting us compare performance across days, months, and years.</p>

<h3>Does doing more WODs hurt you?</h3>

<p>Once every result was normalized and every scored day got one vote, Derrick remained first in almost every version. Across the monthly athlete records, WOD count and Avg had a correlation of −0.05—no meaningful linear relationship.</p>

<p>Avg is still too trusting. An 80% Avg from 20 recorded days may reflect a lucky stretch; a 75% Avg across 200 days includes great, ordinary, and bad ones. Adjusted accounts for this by adding 30 imaginary middle-of-the-board days to everyone. Those days pull a short history toward the middle but barely affect a long one. Avg stays visible; Adjusted determines the ranking.</p>

<figure><img width="1248" height="322" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/04.webp"/></figure>

<p>Over the same 24 months, Jesse averaged 80.6% and Juan 80.9%. After adjustment, Jesse leads 75.7% to 74.6%. Jesse had 177 scored days across 23 qualifying months and 283 scorecards; Juan had 134 days across 20 months and 205 scorecards. The adjustment uses scored days—not raw scorecard totals—because each day gets one vote.</p>

<p>In Overall, Strength and Conditioning are adjusted separately, then blended 50/50.</p>

<p>Consistency only determines who appears: Drop-ins need results in 20% of selected months, Regulars 50%, and Veterans 70%. It does not change anyone's score. Adjusted still sees only what someone recorded—which brings me to the uncomfortable part.</p>

<h3>Self-selection bias</h3>

<p>I cherry-pick. Not always on purpose, but I do it.</p>

<p>I'll happily throw down on a workout full of ring muscle-ups, handstand push-ups, and snatches — my stuff. And I will find a reason to skip the day it's thrusters, air bike for max cals, or sit-ups. (I hope I'm not the only one with Air Bike feelings). So my percentile is, let's be honest, a little inflated by <em>which</em> workouts I choose to enter.</p>

<p>Adjusted can account for how much history you have, but not what you chose to skip. Someone who logs every ugly WOD is measured more honestly than someone who curates. The number is real; it just isn't the whole truth.</p>

<h3>King of the hill</h3>

<p>I also added longer lenses—3 years, 5 years, and "All time"—to find the true king of the hill across nearly nine years of gym history.</p>

<p>Longer windows also reveal absurd lifetime volume. David has 1,312 conditioning scorecards; Mike has 1,336; I have 313. Across Strength and Conditioning, their totals rise to 2,124 and 2,238 recorded results, versus my 517. Standing next to that, my carefully curated percentile feels a little less heroic :)</p>

<p>When you zoom out to 3 years, 5 years, or All time, monthly noise gets distracting. So the trend adapts to the selected range: it smooths over 7 months in the 3-year view, 11 months in the 5-year view, and 13 months in All time. Here you can see David's impressive rise from roughly 60% to 85% on the conditioning chart from 2017 to 2020, then holding near 80% for roughly the next six years.</p>

<figure><img width="1600" height="623" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/05.png"/></figure>

<h3>Is the whole gym improving?</h3>

<p>An 80th-percentile trend means you kept outperforming roughly 80% of the field; it does not measure fitness directly. Your times and weights can improve while your percentile stays flat if the gym improves too. And because participants change each month, it is never exactly the same field.</p>

<p>Age adds another twist. Performance often becomes harder to maintain as we get older, though the timing and rate differ for everyone. Holding the same absolute output from 35 to 40 can itself be meaningful progress against the expected curve. Staying flat relative to a younger or improving field may be impressive too—but percentile alone cannot prove it. For that, I would need repeated benchmarks or age-adjusted scoring.</p>

<h3>The other half: absolute progress</h3>

<p>Percentile tells me whether I'm climbing within the room. But the same workout data can reveal something more personal: whether my lifts are getting heavier, my benchmark times are getting faster, and my overall fitness is improving. That's the next gym chart I'm exploring.</p>

<p>As an athlete, you can also use <a href="https://apps.apple.com/app/id6758307458">PRzilla</a> :) and this was my intention with creating it in the first place: log a score, and it's automatically parsed, tracked, and turned into a picture of your <em>absolute</em> WOD performance over time:</p>

<figure><img width="1206" height="2622" loading="lazy" src="/images/how-do-you-rank-in-your-crossfit-box/06.png" style="max-width:293px"/></figure>

<p>If you run a gym and want this for your box, <a href="mailto:hello@przilla.app">email me</a>.</p>

<div class="footnote" id="footnote-1"><sup>1</sup>
<p>btwb gets closest, with all-time leaderboards per workout and a 'Fitness Level' percentile you can chart over time — but that percentile is against the whole btwb community, not your gym's room, and it's an aggregate fitness score, not your standing on the workouts you actually did.</p>
</div>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Daily leaderboards tell you almost nothing. Pulling years of gym results out of SugarWOD to work out where I actually rank in my CrossFit box.]]></summary></entry><entry><title type="html">Thoughts on first XENOM in Dallas</title><link href="https://perfectionkills.com/thoughts-on-first-xenom-in-dallas/" rel="alternate" type="text/html" title="Thoughts on first XENOM in Dallas" /><published>2026-07-01T00:00:00+00:00</published><updated>2026-07-01T00:00:00+00:00</updated><id>https://perfectionkills.com/thoughts-on-first-xenom-in-dallas</id><content type="html" xml:base="https://perfectionkills.com/thoughts-on-first-xenom-in-dallas/"><![CDATA[<h2>Thoughts on first XENOM in Dallas</h2>

<p><em>Originally published on <a href="https://kangax.substack.com/p/thoughts-on-first-xenom-in-dallas">Substack</a> on July 1, 2026.</em></p>

<p>I just wrapped up competing at a CrossFit event in Dallas — <a href="https://xenom.global/">XENOM</a>, the first of its kind. I've never competed in a big CF event like this, largely because most of them require you to be… well, pretty advanced. CrossFit Games, Wodapalooza, Rogue Invitational: all targeting top 0.01% of the CrossFitters. </p>

<p>The world needed something a lot more accessible. Like HYROX, but for CrossFit and XENOM feels like it's filling that gap. Announced right after Open this year—where I did pretty well—it caught me at the time when I wished for another challenge. And so I signed up. I also thought it would be a nice way to promote <a href="https://przilla.app/about">PRzilla</a>.<sup id="footnote-anchor-1"><a href="#footnote-1">1</a></sup></p>

<p>Overall, I had a blast. The event felt smooth and all athletes I spoke to (in my heat) enjoyed it.</p>

<h3>The good parts</h3>

<p>XENOM must have borrowed comp logistics from HYROX which was great since HYROX has done it hundreds of times now: spectator ring was interweaved with comp areas which made for fun vibes as folks would cheer us up while we were dying on the floor.</p>

<p>It was incredibly cool to compete with pros in the exact same arena! Emily Rolfe, Abi Domit, Jack Farlow, Colten Mertens and Chris Ibarra, Dan Bailey would warm up next to you on a bike or throw a barbell around in a warmup section. And you could spectate all of them from few feet away standing at the same stations where you just competed 20min ago.</p>

<p>That was my favorite part and it was very motivating for my own training.</p>

<p>Overall events felt like they covered fitness pretty well. Most movements made an appearance except dubs. I heard WODPrep folks explain that gymnastic movements like RMUs in one of the workouts rewarded points equal to a squat clean at 130kg. So you can get ahead by being better at those types of events; something to be aware of.</p>

<h3>The not-too-bad parts</h3>

<p>Some small hiccups: long check-in line on 1st day and no athlete briefing before competition, instead they were briefing us before every event and the music and announcers were so loud that it was hard to hear the rules. You could talk to your judge at the station, though, and ask any questions so this ended up being a non-issue.</p>

<p>EPI score is a bit... confusing, but I now have a specific number (<a href="https://www.xenom.global/leaderboard/dallas-june-2026/XEN-2026-02647">4481</a>) that I can work on improving. And I can see which workouts I did well on (rhino dl, snatch) and which need improvement (BB cycling and air bike). The issue is that with something like Rhino DL, I have no way of testing it in training or even knowing why my "1581" power output resulted in certain EPI points.</p>

<p>5 workouts per day for 2 days is a lot. It's Wednesday now and I'm still feeling it so a weekend like this is a challenge on its own. Expect to do slightly worse than in training, although competition vibes are a special kind of magic and I PB'd both my snatch and clean, so... you never know :)</p>

<p>Below are some lessons for myself from all the events:</p>

<h3>Day 1</h3>

<ol>
<li><p><strong>1RM snatch</strong><br>Hit 85kg which is 187.5lb. Previous best was 185lb so a tiny PR. Failed 90kg. I should really clean up my snatch and get that 90kg or more I've been eyeing for <strong>years</strong>.</p></li>
<li><p><strong>Wall walks and Rope Climbs</strong><br>I consider myself good at wall walks but overall fatigue built up and I only got 1 out of 5 rope climbs. A bit better than in training but not much. Would have loved to get all 5. Thick rope tripped me up as I couldn't slide down as well. The issue wasn't rope though but just accumulating fatigue at the end of those 10 wall walks. Protip: wear underpants next time so as not to scrape the skin.</p></li>
<li><p><strong>Air Bike</strong><br>Got only 25 cals. Need to work on this as it ended up being one of my weakest performances. Apparently max power output is a trained skill so TBD on how much I can improve here.</p></li>
<li><p><strong>Barbell Cycling<br></strong>Essentially a DT + 3 thrusters each round.<strong> </strong>Pure anaerobic power test and a carnage unless you've built this skill and capacity. </p></li>
<li><p><strong>2k ski erg + 3k run<br></strong>I finished ski in 8:15 so a bit slower than my desired 8min mark, but the run felt good and I finished in 23:38 which is faster than 25:00 I got in training.</p></li>
</ol>

<p>Lessons learned:</p>

<ul>
<li><p>Get better at air bike (under fatigue), incorporate max effort sprints into training.</p></li>
<li><p>Not all rope climbs are created equal. Do more rope climbs in general. I only started practicing them a month ago so there's a lot of room for growth.</p></li>
<li><p>Get better at BB cycling (this is consistent with my poor DT and Fran scores).</p></li>
</ul>

<h3>Day 2</h3>

<ol start="6">
<li><p><strong>T2B + DB snatches → BMU → RMU</strong><br>This one surprised me as I only got 3 RMUs after 10 BMUs. I would have expected to get 10. Granted, I haven't practiced this specific sequence AND i was coming off of a shoulder injury (AC joint strain) so I'm happy I got any RMU's under fatigue at all.</p></li>
<li><p><strong>Rhino Deadlift</strong><br>My back was beat up from previous day and I was worried that I'd pull it. Did the best I could. Not my fave.</p></li>
<li><p><strong>Burpees → Air Bike → Ski Erg → Burpees</strong><br>All of my least favorite movements in one beautiful nauseating package. Went in trying not to think too much about it. Did better than in training! And still finished 2nd to last in my heat :D</p></li>
<li><p><strong>Clean ladder</strong><br>It's not a good sign when workout calls for AMRAP at 130kg and your max clean is at 95kg :) I knew this was going to be my worst event so I went into it calm and composed, got 10x80kg, 8x90kg, and then even managed to power clean 100kg for a PR. Still, most guys in my heat were doing 110 for reps.</p></li>
<li><p><strong>HSPU + C2B + DB lunges</strong><br>Probably the easiest event for me as I love HSPU's and am good at them. I thought my 9.5 rounds were a good result — and I was top 3 in my heat — but then I saw some folks getting well into 15 rounds… again, you can never be too good at gymnastics.</p></li>
</ol>

<p>Lessons learned:</p>

<ul>
<li><p>Need to work on my aerobic base: it would <em>also</em> help with burpee workout</p></li>
<li><p>Cleans are my kryptonite. </p></li>
<li><p>If you think you're good at gymnastics, there's always room for more/better gymnastics.</p></li>
</ul>

<h3>Final thoughts</h3>

<p>I loved how XENOM made it very clear what I'm good and what I'm bad at. This is something Open can never do: testing overall fitness in just 3 workouts.</p>

<p><a href="https://www.xenom.global/leaderboard?event=dallas-june-2026&amp;type=individual&amp;sex=M&amp;division=RX&amp;age=40-44">I placed 9th in my (40-44) age category</a>. </p>

<p>The scarcity narrative is that I'm only "average", 9th out of 16th men. And this field is only going to get more competitive. The gratitude mindset is that I was able to compete at "Rx" and finished all the workouts. Just 3 months ago I wouldn't be able to do even 3 rope climbs. Just a year ago I wouldn't be able to do even 3 RMU's. 2 years ago I wouldn't be able to get through 10 BMUs. 3 years ago I'm not sure I would have gotten that 100kg clean.<br><br>I'm certain that with a dedicated 3-6 months of hard work, I can get to 5000 EPI which would put me on a podium (top 3). <br><br>LFG.</p>

<div class="footnote" id="footnote-1"><sup>1</sup>
<p>Although it ended up being difficult to talk to people about an app during competition. The upside is that I ended up fixing a bunch of XENOM-related issues in the app.</p>
</div>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Competing at XENOM in Dallas, a new CrossFit competition aimed at regular athletes instead of the top 0.01%. What the format got right, and what it did not.]]></summary></entry><entry><title type="html">Your CrossFit App Doesn’t Know What You Did</title><link href="https://perfectionkills.com/your-crossfit-app-doesnt-know-what-you-did/" rel="alternate" type="text/html" title="Your CrossFit App Doesn’t Know What You Did" /><published>2026-05-09T00:00:00+00:00</published><updated>2026-05-09T00:00:00+00:00</updated><id>https://perfectionkills.com/your-crossfit-app-doesnt-know-what-you-did</id><content type="html" xml:base="https://perfectionkills.com/your-crossfit-app-doesnt-know-what-you-did/"><![CDATA[<h2>Your CrossFit App Doesn't Know What You Did</h2>

<p>CrossFit apps are good at storing WOD scores, but are terrible at knowing the work you've actually done. Here's a WOD from <a href="https://www.murderofcrowsbrooklyn.com/">my box</a>:</p>

<figure><img width="1206" height="715" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/01.jpg" style="max-width:453px"/></figure>

<p>Out of 20 results, only 1 person did it RX:</p>

<figure><img width="1206" height="2622" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/02.png" style="max-width:292px"/></figure>

<h2>Stored, not understood</h2>

<p>In SugarWOD the only way to mark WOD as scaled is via notes. Notice how everyone wrote 155#, 145 lb, 165lb, @165, etc.</p>

<p>Ok, so what's the problem?</p>

<p>Well, the reality is that I've done 10 sets of 2 power cleans + 1 power jerk @165lb. My training log in SugarWOD, however, has no idea that this is what I've done. If I go into "History" for this WOD and click on Apr 24 I see "170" which makes me think that maybe that's the previous weight I did. But no, it brings me to a WOD where I did "1 above knee squat snatch @170lb" not "2 Power Clean + 1 Split Jerk" or even just "Power Clean + Split Jerk" or even just a standalone "Power Clean" / "Split Jerk":</p>

<figure><img width="1269" height="1239" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/03.png"/></figure>

<p>It's entirely wrong and confusing. And if I go into my barbell lift history, this weight I just lifted is neither under Power Clean, nor under Clean and Jerk, nor under Split Jerk:</p>

<figure><img width="1448" height="1086" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/04.png"/></figure>

<p>The two lonely logs for Power Clean are from Mar 2024. That's… 2 years ago. SugarWOD <strong>has no idea about countless times I've done power clean</strong> in a WOD like today.</p>

<p>My barbell PR history in an app simply can't be trusted.</p>

<p>Ok, that's SugarWOD. What about others? Of ~25 apps, only <a href="https://beyondthewhiteboard.com/">BTWB</a> and <a href="https://about.wodup.com/">WodUp</a> treat scaled work as structured data — and both punt on the hard part. BTWB excludes scaled metcons from its fitness rating. WodUp tags them four ways but disqualifies any scaled benchmark from PR tracking. Everyone else — Wodify, SugarWOD, Mayhem, CompTrain, TrainHeroic, Hevy, Strong, the long tail — collapses your work into Rx/Scaled + a score + a notes field.</p>

<h2>We were already half-right</h2>

<p>In <a href="https://apps.apple.com/app/id6758307458">PRzilla</a>, we already tracked all movements correctly when logged individually or as part of a WOD. Here's a workout with Power Clean that I did in Apr 2025 which SugarWOD never showed. It's displayed in the history, alongside individual lifts:</p>

<figure><img width="1600" height="1739" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/05.png"/></figure>

<p>Scaled WODs like this Holleyman were part of the history too, but we didn't actually know how you scaled them outside of the notes. It would just display as "(scaled)" and not be part of any metrics:</p>

<figure><img width="1600" height="1739" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/06.png"/></figure>

<h3>As fast as a notes field</h3>

<p>I always knew this is one of the most important things to have in a CrossFit app worth its salt; after many weeks of work, it's finally here.</p>

<p>You can now specify exactly the <strong>work you've done</strong> when logging any WOD in PRzilla. WOD's are just prescriptions. Every WOD is decomposed into movement blocks. And it's those movement blocks that define your history, stats, charts, etc. in our system.</p>

<p>But here's a harsh truth: the last thing athletes want to do when logging WODs is to spend few minutes tinkering with movements, sets, reps, and weights. Sweaty hands. Still breathing hard. 99% of us write "165#" and move on. That's why it was very important for me to remove as much friction when logging scaled WODs as possible.</p>

<p>Let's go back to the Clean &amp; Jerk WOD. The moment I add it, PRzilla parses it into Power Clean, Split Jerk, and Air Bike; it creates all 10 sets of each, prefills first with 2 reps, second with 1 rep, and adds RX weight to both.</p>

<p>Because I scaled to 165lb, all I need to do is type "165" in Power Clean's topmost weight cell and click "Apply to all sets below". It takes me the same amount of time as writing "165#".</p>

<figure><img width="1600" height="1739" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/07.png"/></figure>

<p>If I scaled that WOD to just power clean I can remove Split Jerk movement from the session by clicking "Delete". It's actually faster than typing "Did not do Split Jerk" in the notes. And I can replace power clean with dumbbell clean just as quickly as typing "Scaled to db cleans".</p>

<p>We now have the power of a full-blown workout editor <strong>within the context of one WOD</strong>. And we have <strong>minimal friction</strong>.</p>

<h2>From score to signal</h2>

<p>When looking at your workout session (left pic), you now see the things you've actually done and not just what was prescribed. A lot more useful metric that goes in line with the rest of the movements in a workout session. After all, we show <code>3 x 2 @ 275lb</code> on Front Squats and not just <em>"Find 2RM in 15min"</em>:</p>

<figure><img width="1600" height="1739" loading="lazy" src="/images/your-crossfit-app-doesnt-know-what-you-did/08.png"/></figure>

<p>The Holleyman (right pic) is now displaying <code>30 x 1 @155lb</code> because we have your actual weight as part of the WOD movements (=work performed). Seeing all the weights in a history list like this feels like a basic right in a CrossFit-aware workout tracker :)</p>

<h3>You can't program what you can't see</h3>

<p>Ok, charts and history lists are nice and all but… does this all <em>really</em> matter? I think so. <strong>Accurate training data is the foundation of your fitness training</strong>. We need to know where you stand in order to design a path forward.</p>

<p>If you scaled Holleyman to 185lb (and finished all 30 rounds), now we know these things:</p>

<ol>

<li><p><strong>1RM</strong> — this tells us that your max is at least 185lb without explicitly testing it.<br>1RM is essential for daily programming.</p></li>

<li><p><strong>Volume</strong> — you've done 185x30=5550lb of Power Clean in that session.<br>When we know your volume, we know the intensity of a given workout relative to your usual effort. If you've only ever done 1000lb of power cleans in a WOD, doing a WOD with 5000lb will wreck you for days. We can mark such WOD as high-volume for <em>your</em> level. A high-volume day can then either be scaled correctly or programmed in a way that doesn't interfere with other workouts in a week.</p></li>

<li><p><strong>Progress</strong> — Holleyman @155lb in 20min vs. Holleyman @185lb in 20min is the kind of progress you can see if we track scaled work. That's density: more work done in the same amount of time. It's important to know if you're trending up, down or plateauing.</p></li>

<li><p><strong>Programming</strong> — passing your results to AI coach makes for highly relevant advice. If it knows you did 30 rounds of power cleans @185lb, it can use that to create a workout that's within your reach. It can tell you to scale up or down next time according to this weight. It can even flag less obvious things like weak squat clean in relation to power clean.</p></li>

</ol>

<p>A coach who doesn't know what you lifted can't tell you what to lift tomorrow. Neither can your app. PRzilla is my attempt to fix that — <a href="https://apps.apple.com/app/id6758307458">give it a try</a>.</p>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Your CrossFit App Doesn't Know What You Did]]></summary></entry><entry><title type="html">CrossFit training in the age of AI</title><link href="https://perfectionkills.com/crossfit-training-in-the-age-of-ai/" rel="alternate" type="text/html" title="CrossFit training in the age of AI" /><published>2026-05-02T00:00:00+00:00</published><updated>2026-05-02T00:00:00+00:00</updated><id>https://perfectionkills.com/crossfit-training-in-the-age-of-ai</id><content type="html" xml:base="https://perfectionkills.com/crossfit-training-in-the-age-of-ai/"><![CDATA[<h2>CrossFit training in the age of AI</h2>

<p>If you've been following this blog, you know I've <a href="https://kangax.substack.com/p/building-an-app-with-cline-claude">spent the past year</a> building PRzilla — from <a href="/using-ai-to-accurately-predict-crossfit/">AI-powered WOD benchmarks</a> to <a href="/my-fitness-from-spreadsheet-to-an-app/">My Fitness visualizations that replaced a decade of spreadsheets</a> to a <a href="/crossfit-tracking-app-but-youre-in-control/">full workout tracker</a>. If you're new here, the short version: I left my tech career to build the CrossFit training app I always wanted, and it turned into something much bigger than I expected.</p>

<figure><img width="1600" height="852" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/01.png"/></figure>

<p>The native app is live — <a href="https://apps.apple.com/app/id6758307458">iOS</a> and <a href="https://play.google.com/store/apps/details?id=app.przilla.przilla&hl=en_US">Android</a>, 11 consecutive weekly releases and counting — and what started as a workout tracker has become an AI training companion that sits on top of your data, reads your recovery metrics, and coaches you like someone who actually knows your training history.</p>

<p>Here's how I got there.</p>

<h3>Why not SugarWOD or Strong or Strava?</h3>

<p>As I <a href="/crossfit-tracking-app-but-youre-in-control/">mentioned earlier</a>, most training apps I've used are either geared towards traditional strength training (Strong/Hevy) or are Crossfit-class-centric and suck at logging any other activity (SugarWOD/Wodify/PushPress) or are too specialized and have poor workout trackers (Strava focuses on running/biking and Whoop focuses on recovery; strength logging is poor).</p>

<p>If I <strong>joined my gym class</strong> on Monday, I want to log whatever WOD was on a whiteboard / in SugarWOD. If on Tuesday I do an <strong>open gym</strong> instead to work on my ring muscle up practice, I want to log 3-3-3-2-2-2-2 and let it be part of my metrics. Maybe I also do an hour on a rower <strong>to work on zone 2</strong>. Or maybe I <strong>went for a run</strong> with a friend who's preparing for Hyrox or a Brooklyn half. I want to log those too. And then perhaps on Friday I'm traveling to SF and will <strong>drop into another box</strong>. The box is on a completely different programming track and often different platform like Wodify or PushPress. I want to <strong>log whatever WOD I end up doing at that gym</strong>. And even if I <em>only</em> ever do my gym programming via SugarWOD, what happens when I <strong>move to another area</strong> and join another box that uses different software—I'd like to keep all my history and lifts.</p>

<p>PRzilla solves all of this. Here's what that looks like in practice:</p>

<ol>
<li><p>No longer tied to a single CrossFit box and their platform</p></li>
<li><p>You can log anything you want</p></li>
<li><p>You own your data</p></li>
</ol>

<h3>Camera advantage</h3>

<p>One feature I'm especially excited about is that you can snap a photo of your gym's whiteboard and the app breaks the entire training day into structured movements and WODs — matching canonical benchmarks when it recognizes them or creating a custom one when it doesn't. WODs automatically get analyzed for performance level bell curve so you can immediately see where you stand.</p>

<p>Here I snapped SugarWOD's whiteboard and it turned it into back squat and shoulder press as single movements (which I could then log as many sets/reps of) and it created a WOD with running and Fran-like couplet, giving me a time to shoot for:</p>

<figure><img width="1600" height="1159" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/02.png"/></figure>

<p>I spent months building and refining this sophisticated workout tracker that can handle any workout. Even though I made it easy to log things, I eventually realized that training log itself is <em>not</em> the end goal. There are two more legs of a tripod that truly elevate training experience to the next level.</p>

<h3>Recovery as the middle lever</h3>

<p>Your training log is the <strong>past</strong>. Your <a href="https://www.reddit.com/r/crossfit/comments/1l1hbej/so_many_online_crossfit_programs_which_ones_are/">programming</a> is the <strong>future</strong>.</p>

<p>They're intimately related to each other: as a coach, I need to know what you're capable of doing in order to design a program to get you from point A (your past) to point B (your goal). Your training log is a snapshot of your abilities, strengths and weaknesses. An advanced lifter that needs to work on their positions in a snatch to bring it from 1.25x to 1.5xBW has very different movements prescribed than someone who just started training and are working on their 5x5 Back Squat progression.</p>

<p>However, Training Data <em>↔</em> Programming don't exist in a vacuum; the subject in the middle—you—responds to demands placed on them (=programming) positively or negatively. One way to measure how they respond to them is via your <strong>recovery metrics</strong>: <a href="https://my.clevelandclinic.org/health/symptoms/21773-heart-rate-variability-hrv">HRV</a>, <a href="https://www.polar.com/en/guide/resting-heart-rate">RHR</a>, Sleep hours/quality. Waking up with low HRV <em>could</em> be related to a hard session yesterday (it tells us that it might have been too intense for you). And it should <em>adjust</em> your programming accordingly (multiple hard sessions lead to overtraining).</p>

<p>And so I've added Apple Health integration:</p>

<figure><img width="1206" height="2622" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/03.png" style="max-width:266px"/></figure>

<p>The feature is in beta but the idea is that you can now see your "readiness" day-by-day. Last week I saw my HRV drop 15ms after back-to-back heavy sessions — a clear signal I was accumulating more fatigue than I was recovering from. Without this data, I would have pushed through another hard day. With it, I dialed back to skill work and was fully recovered by Thursday.</p>

<h3>AI as an orchestrator</h3>

<p>A good coach would start by looking at your training history, create a program to get you from point A (your past) to point B (your goal), then adjust it in real time based on how you respond to it (your recovery metrics).</p>

<figure><img width="865" height="382" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/04.png" style="max-width:516px"/></figure>

<p>Given AI capabilities in 2026, it can do all of the above. It just needs to have access to your health and training data. It can serve as an orchestrator in the middle, carefully analyzing your past (<strong>recent training</strong>), ingesting what's present (<strong>morning readiness</strong>) and adjusting your future (<strong>today or tomorrow's workout</strong>).</p>

<p>Meet your <strong>personal coach</strong>; they know you better than a coach in your gym.</p>

<p>The coach has access to your full training history, remembers past conversations, and can search the web for workout details you mention. You don't re-explain yourself every session — it already knows your recent lifts, your weak points, and your goals.</p>

<figure><img width="1600" height="1739" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/05.png"/></figure>

<p>As you can see, I've been using it for my own training. My honest take, as a coach myself, is that I'm genuinely surprised at how relevant the answers are. I would say they're at ~80-90% of what a human coach would recommend; not perfect and sometimes sloppy, but very useful as a brainstorming partner if you're a high level athlete, and are very illuminating if you're a beginner.</p>

<p>Some things you can ask:</p>

<ul>
<li>"How has my squat been progressing?"</li>
<li>"How should I approach this workout?" (attach a WOD from our catalog or a picture)</li>
<li>"What movements have I not done much lately that decay the fastest?"</li>
<li>"Help me structure this week as a best prep for QuarterFinals next week; recall that I do a long engine team WOD every Saturday"</li>
</ul>

<p>I wanted to create a workout tracker that can handle serious training demands. I ended up with a real-time AI companion at your fingertips that can guide you like a real coach.</p>

<h3>My fitness</h3>

<figure><img width="1600" height="1085" loading="lazy" src="/images/crossfit-training-in-the-age-of-ai/06.png" style="max-width:726px"/></figure>

<p>There's one more piece I haven't talked about yet. All of this data — your training history, your recovery trends, your AI coaching conversations — paints a picture of who you are as an athlete. Your fitness level across workouts. Your strength relative to established standards. How much you've actually practiced each skill over your lifetime. I've been calling this '<a href="/my-fitness-from-spreadsheet-to-an-app/">My Fitness</a>' — a gamified snapshot of your athletic identity that evolves as you train. Think of it as <a href="https://www.whoop.com/us/en/thelocker/healthspan/">Whoop's 'real age'</a> but for functional fitness: one page that shows you exactly where you stand and what to work on next. You've seen it on the web and it's coming to the native app soon.</p>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[CrossFit training in the age of AI]]></summary></entry><entry><title type="html">Overnight success</title><link href="https://perfectionkills.com/overnight-success/" rel="alternate" type="text/html" title="Overnight success" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>https://perfectionkills.com/overnight-success</id><content type="html" xml:base="https://perfectionkills.com/overnight-success/"><![CDATA[<h2>Overnight success</h2>

<h3>Exhibit A</h3>

<p>"Omg, look at this beautiful design", Cat said. "Finally, someone made a beautiful period tracking app".</p>

<p>I was looking at a stylish "28" logo and UI with a color palette that could easily win Apple's app of the year.</p>

<p>It had not just tracking, but symptom logging, workouts with videos, diet suggestions and recipes; a whole ecosystem, aka <a href="https://healthmatters.nyp.org/cycle-syncing-how-to-understand-your-menstrual-cycle-to-reduce-period-symptoms/">cycle-syncing</a>.</p>

<p>Her and I have been half-jokingly talking about creating a cycle app that doesn't suck. The app we were looking at surely looked like one: it had a ton of functionality including much-desired partner integration, the UX made sense, and a gorgeous design tied it all together.</p>

<p>"Wow, someone finally vibe-coded what we've envisioned", I thought.</p>

<p>I fired up deep research. Few minutes later it printed out something that I didn't quite expect: "Started in 2019... two founders who were working in brand..." Before my surprise could wear off, it was replaced with a familiar thought: "Overnight success doesn't exist." I've seen this so many times yet I'd still fall victim to thinking that someone <em>just</em> came up with something brilliant over a hackathon weekend.</p>

<h3 id="exhibit-b">Exhibit B</h3>

<p>"Dude, you gotta teach me how to be so good at ring muscle-ups", Dee told me as I finished my 15th rep on <a href="https://games.crossfit.com/workouts/open/2026/2?division=1">Open 26.2</a>. Dee was a level 2 CrossFit coach at the box I was visiting in Vietnam. The 2nd workout this year ended with a brutal set of 20 ring muscle-ups after about 12min of other shoulder-intense movements and high-skill gymnastics. Even doing 1 muscle-up was a worthy achievement and put you straight into 75th percentile.</p>

<p>My score put me in 90th. Out of 20 RX participants in our gym, only 2 others did better. It seemed I immediately gained respect among everyone as half of the box watched me perform perfect reps as the timer ticked down.</p>

<p>The next day I came across a <a href="https://www.reddit.com/r/crossfit/comments/1rkqrel/261_was_my_worst_workout_in_3_years_and_im_not/">ton</a> of <a href="https://www.reddit.com/r/crossfit/comments/1rgoj71/btwb_scores_261/">Reddit</a> <a href="https://www.reddit.com/r/crossfit/comments/1rnghm0/open_frustrations_and_overall_how_to_get_better/">posts</a> <a href="https://www.reddit.com/r/crossfit/comments/1rp3wsl/man_the_open_is_humbling/">on Open performance</a> frustrations. Folks were devastated with their scores.</p>

<p>This reminded me of my own feelings few years ago: I was doing powerlifting and bodybuilding-style training for many years. I thought I was strong and jacked and fit and all the things. Then I joined a CrossFit class and finished one of the last. In the years that followed I'd routinely perform way below what "good" meant by CrossFit standards. I was humbled again and again.</p>

<p>Don't just take my word for it, here are my Open results to prove it:</p>

<figure><img width="1600" height="1434" loading="lazy" src="/images/overnight-success/01.jpg"/></figure>

<p>What people don't see leading up to those flawless ring muscle-ups are all the times someone practices them consistently, for weeks, months, or years. What they don't see is the slow growth from bottom 5% to top 17% over 6 years. No overnight success here either.</p>

<h3>Exhibit C</h3>

<p>When I started building PRzilla last year, I surveyed over a dozen of CrossFit boxes and their coaches. I wanted to see what they like/dislike about their existing platforms like Wodify or SugarWOD. One theme was common—some gyms recently switched to PushPress, a "new kid" on the block—and they were all quite happy with it. It provided a no-nonsense, all-in-one class management solution as well as social features for members. I remember checking it out couple years ago when I dropped into a box in Bangkok: clean, simple UI, modern features like a social feed. It looked a lot like what I would build.</p>

<p>Fast forward few months and I'm chatting with Dan Uyemura. "PushPress is 12 years old, yet I still come across affiliates who have never heard of it", Dan tells me. I want to say I'm in disbelief but, of course, I'm not. I know better. "We were at 0 profit first few years and I almost quit. And now it feels like we're only getting started."</p>

<p>As I'm <a href="https://kangax.substack.com/p/building-an-app-with-cline-claude">nearing a year of working on my vision</a>, it's easy to want to be so much further. More daily visitors, more registrations, more app installs, more features. Every day you see incredible products that were bootstrapped in "just few months", or vibe-coded in a weekend while talking to Claude on the phone from the subway.</p>

<p>Every day I see 2-3 apps that claim to do the same thing as what I'm building. Shouldn't I be further? Shouldn't I be better?</p>

<p>And so I remind myself: there's no overnight success. The grind continues. Step by step. <a href="https://jamesclear.com/continuous-improvement">1% better every day</a>.</p>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Overnight success]]></summary></entry><entry><title type="html">What’s my XENOM score?</title><link href="https://perfectionkills.com/whats-my-xenom-score/" rel="alternate" type="text/html" title="What’s my XENOM score?" /><published>2026-03-23T00:00:00+00:00</published><updated>2026-03-23T00:00:00+00:00</updated><id>https://perfectionkills.com/whats-my-xenom-score</id><content type="html" xml:base="https://perfectionkills.com/whats-my-xenom-score/"><![CDATA[<h2>What's my XENOM score?</h2>

<p>TLDR: <a href="https://przilla.app/xenom-score">xenom calculator is here</a></p>

<p>The other day I came across <a href="https://www.xenom.global/">XENOM</a> — a newly-founded global CrossFit competition with a known and fixed set of workouts. Think CrossFit Games but standardized to a consistent two-day event similar to <a href="https://hyrox.com/">HYROX</a>. You get a score on each of the 10 workouts and <a href="https://www.xenom.global/scoring">your final result is the sum total</a>.</p>

<p>This got me thinking: can we determine athlete's performance on this kind of event?</p>

<p>In HYROX world, people ask the same question: <a href="https://www.google.com/search?q=hyrox+calculator">what's my estimated HYROX time</a> if I've never run the race? Why do we care? Well, if we know user's estimated time we know their starting level, their weakest splits, best division to compete under, and—most importantly—what improvement is realistic and <strong>what exact program to follow</strong> to get better for the upcoming race. Just like to run a marathon your training would look very different if you're at 8min/mile with 10 miles weekly average or 5min/mile with 50miles/week.</p>

<p>I've been working on <a href="/using-ai-to-accurately-predict-crossfit/">CrossFit benchmarking with AI</a> for a long time. But the XENOM problem is different: instead of figuring out time/reps on a given workout, race estimate is asking us to map athlete performance onto a score on a <em>different</em> workout.</p>

<h3>HYROX vs XENOM</h3>

<p>So how do HYROX calculators do this? Because HYROX is a sequence of single movements, its math is a lot simpler. Take your 1km running time × 8, add time of each of the stations (rowing, wall balls, etc.), and add fatigue multipliers for each.</p>

<p>XENOM estimate is asking: how well would I do on 4 attempts of max snatch in 9min, on a wall walk + rope climb ladder, on a 12min WOD ending with max rep muscle-ups, on a 3km run into 2k ski, and so on.</p>

<p>Obviously the best way — outside of doing an entire mock race — would be to just attempt each of those workouts and plug in your results<sup id="footnote-anchor-1"><a href="#footnote-1">1</a></sup>. But in the age of modern AI and having access to your training data (like we do in <a href="https://apps.apple.com/app/id6758307458">PRzilla</a>), we should certainly be able to figure this out without actual attempts.</p>

<p>1RM snatch (<a href="https://przilla.app/wod/xenom-001">XENOM 001</a>) is easy: just plug your best max lift. Recent snatch matters more than your all-time-best from 5 years ago.</p>

<p>What about more complex workouts?</p>

<h3>Think like a coach</h3>

<p>Putting my coach hat on, to determine the score on <a href="https://przilla.app/wod/xenom-002">XENOM 002</a> which is an ascending ladder of 2 wall walks + 1 rope climb, 4 wall walks + 2 rope climbs, etc. for 8min, I could start by checking user's recent wall walk performance. Ok, they've done 5x5 wall walks a month ago and 3 rope climbs a couple months ago. They're capable of getting to 2+1, 4+2 and can likely get to 6+3 as well and perhaps even 8+4. I'm able to predict this because 5x5 tells me that 5 is not their true max (1RM) but likely 7-8 is.</p>

<h3>Muscular endurance</h3>

<p>Here's the thing: max consecutive reps are not a perfect predictor to what an athlete is able to do. Some aren't able to piece 10 wall walks in a row but they can bang out 30-45 via 10-15 sets of 3 with short rest. That's a first wrench in our calculations. I might see that you've only ever done 3 consecutive wall walks, but I don't know what your <em>muscular endurance</em> on them is. A classic example is <a href="https://przilla.app/wod/cindy">Cindy</a> — if you did 20 rounds RX I can say with high confidence that your muscular endurance is quite strong; you're able to continuously perform 5/10/15 of pull-ups/push-ups/squats for 20 minutes. Same thing with wall walks: being able to do 10 in a row is an indicator of your continuous-set endurance and proficiency in the movement... but an even better predictor could be looking at a <a href="https://przilla.app/?search=%22wall+walk%22">WOD that includes plenty of wall walks</a> like Open 21.1, 22.1, 23.3, etc.</p>

<h3>Similar movements</h3>

<p>As a coach, I can also look at your handstand push-up performance, either as a max-rep number or in a WOD that includes them (e.g. <a href="https://przilla.app/wod/diane">Diane</a>). How about handstand walk. You can do 50ft? Your handstand endurance is generally "strong" and so your wall walk performance should be at least L5. But here's a curve ball: can you extrapolate handstand walk performance from a handstand push-up? The stabilizing muscle stamina has some overlap but you can certainly get good at handstands without ever being able to do a handstand push-up; the latter requires strength and stability throughout the entire range of motion.</p>

<h3>WOD logging is complicated</h3>

<p>Even if we have your training data, CrossFit-style workouts make our calculation hard because <strong>you log a score, you don't log how you performed the movements</strong>.</p>

<p>In a WOD that calls for 3 rounds of 20 C2B, did you do them as 5 sets of 4 because the mastery isn't quite there (e.g. ~L3 perf) or did you bang out sets of 20 (e.g. ~L8 perf) because you <em>own</em> them? We can somewhat extrapolate it from the total time: an athlete that's able to do easy 20 is likely to finish workout faster than the one breaking in 4 sets, but it's not a direct indicator of your movement performance.</p>

<p>Thankfully, when logging untimed practice (standalone movements) in PRzilla, you log them as <strong>sets and reps</strong>. This makes it easier for us to determine your max reps without a standalone test. Just like logging 3x10 bench press @185lb tells us your estimated 1RM.</p>

<figure><img width="1170" height="2532" loading="lazy" src="/images/whats-my-xenom-score/01.png" style="max-width:352px"/></figure>

<p>There is a good opportunity for disruption here: specify sets/reps when logging WODs for that ultimate analytics.</p>

<h3>Movement relevance</h3>

<p>Another curveball: let's say you log 10 rounds on a WOD that's a 12min AMRAP of 5 deadlifts and 5 wall walks. This is a good indicator of your capacity but did you do 10 rounds because of deadlift strength or wall walk strength, and which percentage of each contributed to the final score? It could be 80%/20%—you're a powerlifter with 500lb deadlift who's never done handstand work; or 20%/80% — you're a gymnast who's never done deadlifts. We should be looking at a broader set of workouts: if you consistently do well on those with handstand movements, we can assume with more certainty that you're good at them.</p>

<h3>Submaximal strength</h3>

<p>While we know that absolute strength corresponds to being able to do more work at a given weight, can we really be sure that a person with 255lb clean will do better on <a href="https://przilla.app/wod/grace">Grace</a> than a person with 205lb clean? I've seen guys in the gym who never go above 185lb but they can cycle 135lb forever, and do it fast. On the other hand, my clean is closer to 225 but my HR is through the roof after 15 singles with 135lb. In other words, you don't need to push the ceiling in order to get good at sub maximal weight endurance<sup id="footnote-anchor-2"><a href="#footnote-2">2</a></sup>.</p>

<p>This is why looking at a user's <a href="https://przilla.app/wod/dt">DT</a> and Grace scores is as important as looking at their Clean 1RM; it shows their performance in <a href="https://przilla.app/?tags=Barbell+Cycling">barbell cycling</a>, submaximal strength and endurance rather than their absolute max.</p>

<h3>Ideal benchmarks</h3>

<p>Why is Grace such a great benchmark? Because it asks you to perform X reps in one movement in shortest time. This is similar to a famous <a href="https://przilla.app/wod/30-muscle-ups">30 muscle-ups for time</a>. If we invert this into <strong>max reps in X time</strong>, you have tests like <a href="https://przilla.app/wod/handstand-push-ups-2-min-max-reps">Handstand Push-ups: Max reps in 2 min</a>. Going back to wall walks, if we know max reps athlete can complete in 2 min, that'd be one of the best <em>proxy</em> benchmarks for events like 002.</p>

<h3>HYROX PFT</h3>

<p>An interesting proxy that exists in HYROX world is their <a href="https://hyroxhk.com/physical-fitness-test/">Physical Fitness Test</a>: run 1000m, do 50 burpee broad jumps, 100 stationary lunges, 1000m row, 30 hand-release push-ups, and 100 wall balls.</p>

<p>15–25 min is PRO, 25–35 minutes is Open, 30–40 min is Doubles, 35–45 min is Relay.</p>

<p>Notice anything? PFT is similar to Grace or 30RMU's: it's a chipper of all of the HYROX movements where you perform X reps on each as quickly as you can. This is a direct indicator of strength/endurance/capacity on each of them, making your level approximation quite accurate.</p>

<h3>XENOM PFT</h3>

<p>So should XENOM have its own PFT? HYROX's works because it IS the race, just miniaturized. Same movements, scaled volume, done. Clean and obvious.</p>

<p>XENOM can't do that. Ten events, <strong>nineteen movements</strong> across three completely different fitness domains — a miniature version is just a giant chipper. Technically, it would be something like <a href="https://przilla.app/wod/king-kong">King Kong</a> or <a href="https://przilla.app/wod/fight-gone-bad">Fight Gone Bad</a>. Practically, you'd be testing too many things in a way that's not really representative of individual events: stimulus of a ladder is very different than a stimulus of max-weight attempts or a long endurance grinder.</p>

<p>We <em>could</em> come up with something like this: accessible to a majority of CrossFitters (no muscle-ups, no heavy snatch, no max-cal bike) but it would only be a faint projection of your overall performance.</p>

<p>For time:</p>

<p>1,000m Run<br>
15 Thrusters (60/42kg)<br>
15 Toes-to-Bar<br>
1,000m Echo Ski<br>
10 Cleans (80/55kg)<br>
10 Handstand Push-Ups</p>

<p>Elite: &lt;15 min, RX: 15–22 min, Compete: 22–32 min</p>

<h3>XENOM calculator</h3>

<p>In the meantime, I whipped up <a href="https://przilla.app/xenom-score">XENOM calculator in PRzilla</a>.</p>

<p>Calculator is <strong>smart</strong>. It uses WOD scores that serve as best proxies for an event — DT, Fran, Amanda, 5k run, etc. If there are no benchmarks it analyzes your training data for relevant signals. It decays benchmarks at different rates based on scientific research: strength reduces slowly, endurance diminishes fast, and acquired skills mostly persist.</p>

<p>Here it's showing that I'll probably land right at that fabulous 50th percentile :) You can override each score if you performed that specific workout or feel like our projection is incorrect.</p>

<figure><img width="1512" height="1472" loading="lazy" src="/images/whats-my-xenom-score/02.png"/></figure>

<p>If you're logged in, it uses your existing WOD scores under the hood. If you don't have account, just plug your WOD scores manually and it'll use the exact same smart calculations. The more scores you give the more accurate final prediction is.</p>

<figure><img width="1504" height="1456" loading="lazy" src="/images/whats-my-xenom-score/03.png"/></figure>

<p>I'll be refining this calculator as we learn more about benchmarks. I'd like to add a division estimate to help folks decide what track to compete under.</p>

<h3>AI Coach</h3>

<p>Next version: I'd like to try feeding this through LLM asking it to reason as a coach. Coach doesn't just run formulas — they read between the lines. They notice you've been logging at 70% for two months, that your shoulder-heavy movements have quietly disappeared from your logs, that your snatch PR is from 2022 but you've been crushing Isabel lately. That kind of contextual reasoning is hard to encode in rules.</p>

<p><a href="mailto:hello@przilla.app">Drop me a note</a> if you have thoughts on this or just found it useful.</p>

<div class="footnote" id="footnote-1"><sup>1</sup>
<p>Many HYROX calculators do a very simple math where they ask you to put time of each station.</p>
</div>

<div class="footnote" id="footnote-2"><sup>2</sup>
<p>For more on strength and submaximal strength, see coach Shawn's recent <a href="https://railroadcrossfit.com/what-is-strength-and-who-is-strong/">excellent writeup on this</a>.</p>
</div>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[XENOM scores athletes across 10 fixed workouts. Estimating your total before you ever compete, the way HYROX athletes estimate a race they have never run.]]></summary></entry><entry><title type="html">Reflections on training, 2025 → ‘26</title><link href="https://perfectionkills.com/reflections-on-training-2025-26/" rel="alternate" type="text/html" title="Reflections on training, 2025 → ‘26" /><published>2026-01-24T00:00:00+00:00</published><updated>2026-01-24T00:00:00+00:00</updated><id>https://perfectionkills.com/reflections-on-training-2025-26</id><content type="html" xml:base="https://perfectionkills.com/reflections-on-training-2025-26/"><![CDATA[<h2>Reflections on training, 2025 → '26</h2>

<h3>Looking back</h3>

<p>A big shift last year has been towards <strong>skill learning</strong> and widening <strong>movement repertoire</strong>. Now that I'm 40, I can't quite recover as fast after going hard on WODs. I've also grown weary of constantly chasing higher strength numbers: squat, deadlift, clean. Most of those have plateaued years ago and now need a dedicated multi-month cycle to make meaningful progress<sup id="footnote-anchor-1"><a href="#footnote-1">1</a></sup>. And so I found that learning new movements and practicing existing ones is one way to improve fitness while giving body a break. It's also fun and rewarding as you see your quantity and quality go up.</p>

<h3>Testing ↔ Training ↔ Recovery</h3>

<p>I'm now increasingly seeing my time in the gym as existing in one of 3 buckets.</p>

<p>I'm <strong>testing</strong> if I perform a for-score workout and push myself to my max or near-max. This is the most fun one, of course; it's rewarding to end up in top 3 on a leaderboard. But it also comes with the highest cost. For muscular stamina workouts like Cindy or Eva, you're very sore for the next few days due to the density of work (volume/time). For near-max lifts, your CNS is fried and joints take a beating.</p>

<p>I'm <strong>training</strong> if I perform a prescribed body of work at a specific, usually RPE5-8 intensity. Training could be timed but often isn't. 40min EMOM with ~30sec rest each min is a good example. So is doing 10 sets of 3 snatches at ~75% with 1-2min rest. These are usually less fun, but they need to constitute most of the time.</p>

<p>I'm <strong>recovering</strong> if I consciously limit my work to a very low intensity and/or perform low-impact movements. This is where Zone 2 training comes in, such as spending 45-90min on a bike or a rower at ~130bpm (for my age). I managed to make these type of days less boring by throwing skill learning into the mix; I would do some handstand walks every 250-500m on a rower, or do 1-2 ring muscle-ups. Anything that's ~20% of your capacity and ideally bodyweight-only.</p>

<p>Ideal week then looks like 1-2 days of testing, 3-4 days of training, and 1-2 days of recovery. This looks easy on paper but tends to be a very delicate balancing act and is quite difficult to get <em>perfectly</em> right.</p>

<p>The moment I push my testing a bit too much, I get injured. If I don't include recovery, I stop progressing or quickly overtrain. Another takeaway: just because I can ace that workout and beat my (or other) scores, doesn't mean I should.</p>

<h3>Old dog, new tricks</h3>

<p>Last year I've probably spent 30% on each of the following:</p>

<ul>
<li><p>High level gymnastic skills — <strong>Ring Muscle Ups</strong> and <strong>Handstand Walk</strong></p></li>
<li><p>Zone 2 training</p></li>
<li><p>Longer/endurance-heavy WODs</p></li>
</ul>

<p>RMU's and HSW were the last two pieces of the CrossFit puzzle. It was what I needed to be able to RX 99% of WODs in a typical class.</p>

<p>I went from being able to do 2-3 muscle-ups to hitting 10 in a row, being able to do 4-5 on any given day, and under fatigue during WODs. I even accidentally progressed to 2-3 strict ones! Handstand walks were also something I struggled to not fall just a few feet in, and now I can almost always go 50ft, confidently. The power of practice truly can not be underestimated: all I did was show up and practice every week, sometimes once, sometimes twice. In that regard, the year has been a success.</p>

<p>The other part was focusing on improving my endurance: weekly zone 2 training and grinding out &gt;30min WODs. The year ended on a good note as I finally completed Eva RX at 44:04. Earlier in 2025, I've done it with 24kg bell in 40min. Even if I didn't improve in my fitness, it feels like my mental fortitude has gotten better with these grueling long workouts<sup id="footnote-anchor-2"><a href="#footnote-2">2</a></sup>; I've learned to suffer for longer and under more fatigue.</p>

<p>It's hard to tell if my Zone 2 training is having an actual impact on VO2 max but it certainly feels like I can sustain on med/long-duration WODs better. Running also feels the best it ever has.</p>

<h3>Advanced lifter curse</h3>

<p>I walked into our box yesterday and saw a "Q1 2026 Goals" board. Someone wanted to hit a 210kg squat. Below were: "3 muscle-ups", "15ft handstand walk" and a "kipping pull-up". Last year I wrote "10 RMU" and "50ft handstand walk". Few years ago I would have written 365lb (2xBW) squat or 185lb (1xBW) shoulder press; now all conquered.</p>

<p>I starred at the board, unsure about my next goal.</p>

<p>I've hit most of the things written on it and much more. It wasn't about feeling superior; I was reminded of how far I've come and how many are still on their way to reach goals that I've conquered long ago.</p>

<p>Do I really need to work towards hitting 15 consecutive RMUs? Or 2x50ft handstand walks, which would be a natural progression. I've hit the point of <strong>diminishing returns</strong>. Being able to walk over obstacles is a semifinals territory and isn't something I'd ever need in a regular class. To play devil's advocate, hitting strict ring muscle-up isn't something you'd need in a class either! Yet I wanted to be able to do it as a pure form of incredible upper body strength and control.</p>

<p>As I'm nearing 15 years into my fitness journey, all of this feels like an "advanced lifter" curse. When you've reached 90% performance on most things, the remaining 10% start to take a lot more time and the progress slows down to a crawl.</p>

<figure><img width="1600" height="745" loading="lazy" src="/images/reflections-on-training-2025-26/01.png"/></figure>

<p>One option is to keep pushing towards Level 3 and 4 on this CrossFit standards sheet I've been using for the last few years. But while most of the Level 3 are achievable with a few month of dedicated practice, I find that many of the Level 4 would take years.</p>

<p>Genetics aside, the reason I hit 2.5xBW deadlift was because I powerlifted for a few years. Similarly, the only way to run 5min mile is to be… a runner. To go from my current 6:30 best (and now, likely, closer to 7:15), I'd need to start running 2-3 times a week, build capacity over a year, slowly improve speed, slowly adopt my body to volume, train the body to go that fast for that "long". You don't just run 5 min mile. You only do that if <strong>you're a runner</strong>. And so the question then becomes: do I want to put all my eggs in one basket? How would running 2-3 times a week affect my strength, my muscular endurance, my gymnastic proficiency, and other aspects of fitness?</p>

<h3>Maintenance and aging</h3>

<p>Biological age matters more than chronological one<sup id="footnote-anchor-3"><a href="#footnote-3">3</a></sup>, but it's hard not to think about turning 40. Relatively, my body has less work capacity than an average 30 yo athlete of the same "level". CrossFit Open also acknowledges it, putting me in a 40-45 bracket. Should the goal this year (and going forward) then just be to <strong>maintain existing fitness</strong> and avoid major regressions?</p>

<p>I'm already doing that intuitively. I'd make sure to squat heavy at least every other week: I'm way below my all-time-best 365lb but even hitting 300lb right now feels like a good baseline and puts me in the top 5 in the class. I might not be able to do 100 dubs like I did at one point, but comfortably banging out 30-50 goes a long way in any workout.</p>

<p>I realized that reaching a certain goal serves as an <strong>overextension that builds a ceiling</strong>. Hitting 10 RMU's last year was a nice goal but the ultimate "friend we've made along the way" was the fact that 3-5 started feeling like nothing. To go back to running analogy, training for a 5 min mile would create a baseline where running 7min mile feels like a child's play. I'd just need to keep that baseline by running once or twice weekly.</p>

<h3>CrossFit Open</h3>

<p>I ended up putting "Open 2026, <strong>do better than last year</strong>" on the whiteboard. It's a fun short-term goal that would certainly push my engine further, but I'm very much aware that Open can be easily gamed and is just a subset of overall fitness and what CrossFit wants you to achieve. Next two months I'll be focusing on frequent practice of top 5 open movements that are skill-sensitive: dubs, thrusters, muscle-ups, c2b, and rowing. I will also double-down on nausea-like WODs that Open is famous for.</p>

<h3>Engine</h3>

<p>I think if I were to pick one goal this year, it would be to continue building the engine (= endurance). I've built strength over many years and I've always been good at gymnastics (thanks to yoga since early age). Endurance is still lacking so I need to keep hammering &gt;20 min WODs, more running, more hero ones.</p>

<h3>Self-regulation</h3>

<p>Earlier last year I did Vipassana and it was pretty life-changing. I've noticed a lot more calm during intense workouts where the feeling of "dying" (zone 4-5) still feels awful but at least it doesn't provoke as much of a panic state as it would before. I'm able to sustain in red for longer.</p>

<p>One of the intentions for this year is to maintain my meditation practice as it helps in both, "life" and when on the training floor.</p>

<div class="footnote" id="footnote-1"><sup>1</sup><p>Although I did finally hit 185lb (1xBW) snatch this year!</p></div>
<div class="footnote" id="footnote-2"><sup>2</sup><p>Another one I'm particularly proud of was 8 rounds of: 5 RMU, 7 DL (225/155), 5 Toes Through Rings, 7 Double KB Snatches (53/35), 5 HSP which I RX'd in 33:13</p></div>
<div class="footnote" id="footnote-3"><sup>3</sup><p>Whoop says I'm 4 years younger and Function Health says I'm only 30yo</p></div>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[Reflections on training, 2025 → '26]]></summary></entry><entry><title type="html">CrossFit tracking app but… you’re in control?</title><link href="https://perfectionkills.com/crossfit-tracking-app-but-youre-in-control/" rel="alternate" type="text/html" title="CrossFit tracking app but… you’re in control?" /><published>2025-12-20T00:00:00+00:00</published><updated>2025-12-20T00:00:00+00:00</updated><id>https://perfectionkills.com/crossfit-tracking-app-but-youre-in-control</id><content type="html" xml:base="https://perfectionkills.com/crossfit-tracking-app-but-youre-in-control/"><![CDATA[<h2>CrossFit tracking app but... you're in control?</h2>

<p>As I was working on <a href="https://przilla.app">PRzilla</a> — <a href="/my-fitness-from-spreadsheet-to-an-app/">an app to track WOD scores, fitness skills and standards</a>, I quickly realized that I needed a way to log new sessions without constantly doing a clunky, manual SugarWOD / Strong app export/import.</p>

<p>There was really no way around it — I had to build a "workout tracker" 🙈</p>

<p>The thing about most CrossFit tracking apps — <a href="https://www.sugarwod.com/">SugarWOD</a>, <a href="https://www.wodify.com/">Wodify</a>, <a href="https://www.pushpress.com/">PushPress</a> — is that they're focused around gym programming. This makes sense since community is at a core of CrossFit's methodology. You sign up to the gym, attend classes, and never have to worry about what to work on, the workouts just appear in your app.</p>

<p>On the end of the spectrum there are apps like <a href="https://www.strong.app/">Strong</a> and <a href="https://www.hevyapp.com/">Hevy</a> which are geared towards traditional strength training. They're your classic workout trackers for individuals walking into the gym, hitting 3x10 bench press and 3x15 tricep extensions because they saw it in a Men's Health magazine.</p>

<figure><img width="1600" height="318" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/01.png"/></figure>

<p>I come from the "left", which I did for many years, using Strong app since 2018 (and <a href="https://en.wikipedia.org/wiki/Fitocracy">Fitocracy</a> before that… RIP). Then I started doing more CrossFit-style workouts and I'm now signed up to a box that uses SugarWOD. Couple times a week I join the classes if they look fun or include something I want to work on or… I simply want to workout with friends.</p>

<p>As such, I'm often <strong>somewhere in the middle</strong>: I want to be able to come to the gym on Monday and log my own workout of, say, 10x3 ring muscle-up practice and 5k row that I do in between RMU's, followed by a WOD like 15min AMRAP of 1,2,3,… shuttle sprints and wall walks. And I want to come to the class on Tue and log whatever SWOD, WOD, and other things they're doing.</p>

<p>Now here's the crazy part — there seems to be a <strong>bizarrely large separation</strong> between these two camps. PushPress, Wodify, and SugarWOD all make it really hard to log individual movements. You're either doing Fran (and logging your score) or you're shit out of luck. Wodify and PushPress are the most restrictive — you <strong>can't even use them without a gym subscription</strong>. I get it, their business model revolves around gyms paying fees that depend on number of users. SugarWOD is a bit more relaxed in that you can switch between gyms (as long as you know their invite code).</p>

<p>All 3 support custom logging but it's <em>incredibly</em> limiting and is always tucked away behind multiple menus. This use-case isn't what they're optimizing for.</p>

<p>Here's Wodify help docs <a href="https://scribehow.com/viewer/Entering_Custom_Workout_Results_in_the_Wodify_App___1TzE8v_RUaOBkEkheDs8A">showing 5 step (!) process</a> on how to log 2 sets of muscle-ups for the day.</p>

<figure><img width="1600" height="384" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/02.png"/></figure>

<p><a href="https://help.pushpress.com/en/articles/8295187-member-app-log-your-own-workout">PushPress isn't too far off</a>:</p>

<figure><img width="1600" height="785" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/03.png" style="max-width:728px"/></figure>

<p>In SugarWOD, you need to click into "More" → "Logbook" → "Log a workout", then chose from a limited list of weightlifting, endurance, or gymnastics. When I say limited, it means you can't even log 10x3 of RMU (it mostly has "max reps" wods).</p>

<p>One exception to the rule is <a href="https://beyondthewhiteboard.com/">BTWB</a> app that's often considered the golden standard for CrossFit tracking. That's why I put it closer to the middle in my diagram. It allows you to log individual movements as well as any WOD — custom or canonical — and it doesn't lock you into a specific affiliate.</p>

<p>But while its "New workout" starts off nicely with "Single Movement" (this is your classic Hevy/Strong logging) vs. "Multiple Movements" (this is your classic WOD), it quickly transforms into a clunky UI that resembles a cockpit of an airplane, drowning you in a myriad of options that are frustrating to comb through:</p>

<figure><img width="1600" height="1144" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/04.png"/></figure>

<p>I got to the gym and I have no plan. I decide to start with some light snatches… just give me a quick way to start adding the sets. With Strong, it takes exactly 2 seconds and 3 clicks: "Start an Empty Workout" → "Add Exercises" → Type "Sna" → "Add" and you're all set.</p>

<figure><img width="1600" height="857" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/05.png"/></figure>

<p>If I want to then make those sets into a WOD, perhaps there should just be a way to do that. And if instead of an individual movement I want to throw in a quick WOD next, after my untimed practice, perhaps there should just be a quick option for that; and this is where I'd chose from AMRAP, For Time, For Load, EMOM, etc.</p>

<p>BTWB is close but is not quite that perfect <em>best-of-both-worlds</em> app.</p>

<h2>"But why" and long-term tracking</h2>

<p>Wodify docs on how to add custom workouts list some great examples for <em>why</em> you'd even want to log them:</p>

<figure><img width="1390" height="374" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/06.png"/></figure>

<p>I'll add few more:</p>

<ul>
<li><p>What if I'm injured and can't do today's programming?</p></li>
<li><p>What if I simply don't like today's programming?</p></li>
<li><p>What if I feel kinda off today and just want to get on a bike and do some light cardio?</p></li>
<li><p>What if I'm trying to get better at something so I'm substituting today's programming or supplementing it?</p></li>
<li><p>What if I <em>completely</em> switch to another affiliate programming because it serves me better?</p></li>
<li><p>What if I stopped coming to an affiliate and switched to a home gym? Or moved to another city or country?</p></li>
</ul>

<p>BTWB is the best of all evils here, if you can get past their awkward UX. But all the other apps are simply <strong>not great options for long-term CrossFit tracking</strong>. Most importantly, it's important to be in control of your data: WOD performance and all the individual movement history.</p>

<p>An ideal app should allow to:</p>

<ol>
<li><p>Log individual movements aka Strong/Hevy; <strong>plain sets-and-reps/time/distance</strong>, quick and easy.</p></li>
<li><p>Log a score for a <strong>canonical WOD</strong> (Fran, Murph, Open 21.4, etc.)</p></li>
<li><p>Log a score for a <strong>custom WOD</strong> (whatever you came up with — AMRAP, For Time, For Load, EMOM, etc.)</p></li>
<li><p><strong>Subscribe to any box</strong>, see their programming, log their WOD's as part of your own data! This is really just 2 or 3 but the WODs (canonical or custom) are provided by the gym.</p></li>
</ol>

<p>Bonus points if you can specify exactly how you scaled a WOD so that the data can be analyzed programmatically. Adding "25# db" in notes doesn't count since we can't really measure your progress and your effort!</p>

<h2>PRzilla as a hybrid workout tracker</h2>

<p>After couple months, I'm now pretty satisfied with the workout tracker in PRzilla. I've been using it exclusively for a few weeks and have gotten to the point where I no longer need to use any other app.</p>

<figure><img width="1600" height="4842" loading="lazy" src="/images/crossfit-tracking-app-but-youre-in-control/07.png"/></figure>

<p>I've learned that building "simple" workout tracker isn't as trivial as I thought 😅 Despite engineering for 20 years I still grossly underestimate complexity of systems. The hardest task was figuring out active/draft vs. completed sessions as well as various constraints: there could only be 1 draft at a time, there could only be 1 workout session per day, etc.</p>

<p>Then there're hidden things like ranking movements in a search list so you get most relevant show up at the top. It's what separates good UX from the great one. I also use supersets almost daily so I came up with a UX to link cards together via drag and drop — something I haven't seen in other apps.</p>

<p>The best part about building your own app is that you control an entire experience and can "easily" implement any features you need. E.g. one idea I have is to show inline insights about workout sessions after you've done them: total volume lifted or distance ran, relative effort (based on your 1RM), milestones ("you've just reached 1000 miles cycled this year" or "this is your 2nd best consecutive ring muscle-up set"), etc. This could be shown every time you log a workout.</p>

<p>I can now also easily create goals and display them as progress bars. Perhaps you're working towards a 300lb bench press: we can show your progress easily. Or maybe you're working on reaching 100 muscle-up sessions this year: we can show that as well.</p>

<p>The things I haven't added that exist in Strong/Hevy that I might consider in the future:</p>

<ul>
<li><p>Movement reordering (easy to add but it needs to work well with supersets)</p></li>
<li><p>Rest time between sets</p></li>
<li><p>Template-like logging; i.e. adding set in UI is not the same as completing it</p></li>
</ul>

<p>Stay tuned on the future developments and <a href="mailto:hello@przilla.app">drop me a note</a> if you're using it and have feedback (or would like to have all of your SugarWOD data imported).</p>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[CrossFit apps are built around gym programming, and strength apps are not built for WODs. Why PRzilla needed its own tracker, with the athlete in control.]]></summary></entry><entry><title type="html">My Fitness: from spreadsheet to an app</title><link href="https://perfectionkills.com/my-fitness-from-spreadsheet-to-an-app/" rel="alternate" type="text/html" title="My Fitness: from spreadsheet to an app" /><published>2025-10-04T00:00:00+00:00</published><updated>2025-10-04T00:00:00+00:00</updated><id>https://perfectionkills.com/my-fitness-from-spreadsheet-to-an-app</id><content type="html" xml:base="https://perfectionkills.com/my-fitness-from-spreadsheet-to-an-app/"><![CDATA[<h2>My Fitness: from spreadsheet to an app</h2>
<p>My fitness journey—as is the case with many teenagers—began with bodybuilding. I wanted to look good. Soon after, I found <a href="https://stronglifts.com/stronglifts-5x5/">StrongLifts 5x5</a> and got into powerlifting. It became all about numbers: getting bigger bench, bigger squat, bigger press. Yet, I’ve always been drawn to the notion of <a href="https://archive.t-nation.com/training/total-athleticism-the-workout">Total Athleticism</a>, as coined by Max Shank in one of the articles on <a href="https://t-nation.com/">T-Nation</a> that I used to read religiously around 2015<sup id="footnote-anchor-1"><a href="#footnote-1">1</a></sup>. Having a 300 bench was cool but I didn’t want to be one of those powerlifters who had massive numbers yet couldn’t run up the stairs. I wanted to also be good at running, calisthenics, kettlebells. Eventually this brought me to “functional fitness” and, of course, CrossFit, which popularized it circa 2000.</p>
<h3>CrossFit standards</h3>
<p>In my fitness circles, CrossFit was still criticized for its reckless high-skill olympic movements performed at high intensity. Blame the epic fail videos of someone doing something stupid and the ignorance around the methodology. While I was on the offense about doing actual CrossFit, I loved the “variable movements” concept. I found a couple of “crossfit athlete standards” posters online and made this spreadsheet to track my progress across multiple domains. It immediately exposed all my gaps: I could squat 2x bodyweight but my snatch was at a measly 100lb and all the speed and work capacity tests were barely at level 2:</p>
<figure><img width="1782" height="1112" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-1.png"/></figure>
<p>If I wanted to be an all-around developed athlete, these were the things I had to work on. The standards also served as an “objective” benchmark. To consider yourself “advanced” here’s how many pull-ups you had to be able to do; and this is how fast your 1 mile run would have to be. It gave me a concrete goal to work towards. These spreadsheets became my north star for the following few years. For a challenge junky like me, they were a perfect long-term obsession.</p>
<figure><img width="2196" height="1008" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-2.png"/></figure>
<h3>Strength and Skill</h3>
<p>The spreadsheet overload was real. This wasn’t the first one I used. As far back as 2011, I found <a href="https://exrx.net/Testing/WeightLifting/StrengthStandards">exrx.net Strength Standards</a> and created this view to understand where I stand strength-wise and what to work on:</p>
<figure><img width="2304" height="816" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-3.png"/></figure>
<p>In the last couple years I started tracking my frequency and total-lifetime-session-count of certain movements I wanted to be better at — <a href="https://kangax.substack.com/i/159510772/practice-makes-perfect">a concept I wrote about before</a>:</p>
<figure><img width="886" height="936" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-4.png"/></figure>
<p>Finally, I tracked my proficiency levels on various CrossFit -specific movements as a way to advance my skill and become fluent in them during WOD’s.</p>
<figure><img width="1398" height="824" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-5.png"/></figure>
<h3>One app to rule them all</h3>
<p>The year was 2025. <br/>I was a software engineer.<br/>And I would still manually update a spreadsheet with the number of times I’ve performed a certain movement that I deemed as “needed practice“.</p>
<p>This was embarrassing.</p>
<p>When I embarked on <a href="/przilla-crossfit-ai-companion/">building PRzilla</a>, I realized that perhaps this was the time to ditch manual spreadsheet tracking. I could now build an app that would have <em>all</em> of this backed in:</p>
<ul>
<li>
<p>show your <strong>fitness level</strong> across multiple movement patterns/domains (strength, endurance, gymnastics, work capacity, etc.)</p>
</li>
<li>
<p>show your <strong>raw strength</strong> benchmarks (squat, deadlift, snatch, push press, etc.)</p>
</li>
<li>
<p>show your <strong>skill proficiency</strong> as a “lifetime sessions performed”</p>
<ul>
<li>
<p>if you’ve done ring muscle-ups <em>only</em> 20 times in your life, you’re unlikely to be better at them vs. someone who has done them 120 times</p>
</li>
</ul>
</li>
<li>
<p>show your <strong>skill ownership</strong> as a “max consecutive reps able to do“</p>
<ul>
<li>
<p>being able to do 50 consecutive kipping pull-ups means you own them; this movement is unlikely to be your limiting factor in any WOD that has them</p>
</li>
</ul>
</li>
</ul>
<h3>Whoop, Apple Fitness, and the rise of quantified fitness</h3>
<p>I use <a href="https://whoop.com/">Whoop</a> and I absolutely love how it’s able to distill complex/boring HRV/RHR metrics into simple, quantified scores like recovery and strain. Whoop and Apple Fitness—that’s just as big on quantifiable fitness—were a big motivation for this app.</p>
<figure><img width="1940" height="2048" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-6.jpeg"/></figure>
<p>On the other hand there are apps like <a href="https://beyondthewhiteboard.com/">BTWB</a> which is one of the most extensive Crossfit-style workout tracking tools, but I found its UI unintuitive and UX clunky:</p>
<figure><img width="2440" height="1512" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-7.webp"/></figure>
<h3>A snapshot of your fitness</h3>
<p>And so I turned all my spreadsheets into a simple snapshot consisting of 5 views: your level, balance, strength, ownership, and practice. These could be easily extended in the future with any other <strong>modules</strong>: time domain distribution, specific goals tracking like work capacity or endurance. Or even sport-specific ones like Hyrox.</p>
<figure><img width="1986" height="1214" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-8.png"/></figure>
<h3>SugarWOD parser</h3>
<p>In order to turn all my workout data into beautiful charts, I needed to… have that data in the first place. One issue was that it was split between: </p>
<ul>
<li>
<p>SugarWOD — scores of WODs prescribed by my box that I did</p>
</li>
<li>
<p>wodwell.com — common WODs that I did on my own</p>
</li>
<li>
<p>Strong app — traditional strength training workouts that are not WODs (aka sets and reps)</p>
</li>
</ul>
<p>Importing wodwell scores was easy since it was just a map of common wod (fran, murph, etc.) to a score. Strong app export would be a lot more involved since I would have to implement sets and reps tracking (as well as workout sessions, potential rest values, and so on). So I decided to focus on SugarWOD import. And this is where the fun began.<br/><br/><strong>Good news</strong>: SugarWOD allows easy export of all of you workout history.<br/><strong>Bad news</strong>: SugarWOD data is very… unstructured.</p>
<div><div><div>
<p>Thanks for reading Juriy’s Substack! Subscribe for free to receive new posts and support my work.</p>
</div>
</div>
</div>
<p>Here’s an example of CSV:</p>
<pre><code>09/14/2022,WOD,24 Minute AMRAP:Row 240m12 Lateral Burpees over Back of Rower48 Double Unders24 Alternating Front Foot Elevated Reverse Lunges (53/35)*,3.073,3+73,Rounds + Reps,,"[{""rnds"":3,""reps"":73}]",,SCALED,</code></pre>
<p>As you can see, we have an arbitrary, potentially non-descriptive wod title like “<em>WOD</em>” plus gobbled up, plain-text description like “<em>24 Minute AMRAP:Row 240m12 Lateral Burpees over Back of Rower48 Double Unders24 Alternating Front Foot Elevated Reverse Lunges (53/35)*</em>” that’s missing basic formatting / newlines.</p>
<p>As humans, we’re able to quickly parse this into:</p>
<pre><code>24 Minute AMRAP:
Row 240m
12 Lateral Burpees over Back of Rower
48 Double Unders
24 Alternating Front Foot Elevated Reverse Lunges (53/35)*</code></pre>
<p>Thank god we live in the age of LLM’s which are capable of reasoning through a messy jammed up text like this just like we—humans—do. </p>
<p>Another peculiarity was <strong>load-based entries</strong>. In SugarWOD you can program them in a workout and specify sets and reps, e.g. 5 sets of 3 snatches. Users can then log a value for each of the 5 sets. In order to present your performance on the leaderboard, SugarWOD allows coaches to specify <strong>how to score those sets</strong> — max value (who got the highest weight)? lowest value (who got the fastest row time)? sum of all values (who did the most work overall)? and so on. The export doesn’t expose this scoring criteria so parser needs to infer it based on the sets data. In the example below, we can see that the scoring was using SUM of 12 sets and so 695 is not the weight user did as a 1RM squat snatch; the real squat snatch values are in the sets field:</p>
<pre><code>05/31/2024,WOD,12 ROUNDS:30 Second CAP:3 Toes to Bar2 Lateral Barbell Burpees1 Squat Snatch*REST 1 Minute.*Increase weight as able.,695,695,Load,,"[{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":65}]",,RX,</code></pre>
<p>In this case it’s “obvious” that 695 wasn’t a 1RM snatch (current world record is 496lbs) but some cases are much less obvious so the parser needs to be very careful there.</p>
<h3>LLM-powered pipeline</h3>
<p>And so after many weeks of experimenting, refining, rewriting, and adjusting based on real data (thanks to amazing volunteers in my gym), I now have a pretty smart and capable pipeline that turns unstructured SugarWOD data into a structured PRzilla data:</p>
<figure><img width="4441" height="5958" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-9.png"/></figure>
<p>One of the biggest findings—and things that slowed me down—was realizing that a giant, monolithic LLM prompt we used to generate giant JSON with a dozen of different fields (gpp, modality, difficulty, benchmarks, classification, etc.) was taking way too much time, was way too expensive, and <strong>often produced errors</strong> as it tried to do too many things at once. </p>
<h3>Parallelization for the win</h3>
<p>I then switched to a series of small, targeted LLM parsers/prompts—as seen on the diagram above—for each of the metrics and ran them in parallel. The results were astonishing: faster and cheaper execution and <em>much</em> more accurate results. This also gave me flexibility to run only specific parsers in specific cases; e.g. when parsing your historic data we want to extract movements (to feed it into our proficiency metrics), performance levels (to understand how your fitness level progressed), time domain (to see a time domain breakdown), and so on. We don’t care about coaching/scaling/stimulus module since the workouts are in the past and users don’t need to know that! However, those modules are important for <em>new </em>workouts, when using <a href="https://przilla.app/wod/analyze">analyze</a> or <a href="https://przilla.app/wod/generate">generate</a>. </p>
<p>Finally, it allowed me to run these parsers in parallel which meant that a WOD analysis was now taking <code>time_of_slowest_module</code> (usually ~12-15sec) rather than sequential <code>SUM(module1, module2, …)</code> that would usually take up to 40 sec!</p>
<h3>Unstructured to structured</h3>
<p>The end result is incredible. We’re able to turn a textual mess like this, into an <strong>actual workout</strong> and your<strong> actual performance. </strong>Here we see that 14min AMRAP was properly parsed into movements like “Wall Walk” and “Front Squat”; that it’s an endurance and stamina -heavy workout (yep!), that it’s classified as “Very Hard” and its modality are equally “Gymnastics” and “Weighlifting”. Moreover, AI determined that user’s score of 80 falls right around L3 (which we would likely adjust to L3.5 or L4 due to workout’s difficulty):</p>
<figure><img width="2072" height="1480" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-10.png"/></figure>
<p>Parsing “Wall Walk” as a movement is what allows us to count that towards your practice score! Notice that we now know that you’ve done “Wall Walk” 32 times in your life with the recent one being 6 months ago.</p>
<figure><img width="1902" height="1424" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-11.png"/></figure>
<p>Now that we have this structured data, the possibilities—all of a sudden—are endless. We can easily, and more importantly, <strong>automatically</strong> show your strength levels: powerlifting, weightlifting, crossfit total:</p>
<figure><img width="1886" height="1436" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-12.png"/></figure>
<p>We can derive how good you are at Endurance, Stamina, Power and other GPP components based on your scores on WODs that are high in those:</p>
<figure><img width="1892" height="1478" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-13.png"/></figure>
<p>Because we’ve determined time domain of all the wods you’ve ever done, we can show if you’re leaning towards shorter or longer ones. Yes, parsing 1300 entries is expensive but at least we can marvel at the end result 😅. Here is coach Mike’s real data dating back to 2018. You can see that early years prioritize short WODs (&lt;12min) whereas last couple years the focus has shifted towards longer, HYROX-style ones:</p>
<figure><img width="2262" height="992" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-14.png"/></figure>
<p>And, of course, we have ability to see all the WODs for any given movement (why it’s so important to parse those for all the custom WODs and create proper associations). Here you can see that Mike has done over 232 lifetime front squat sessions over 8 years, 157 as dedicated lifts and 75 as part of WODs:</p>
<figure><img width="1752" height="1478" loading="lazy" src="/images/my-fitness-from-spreadsheet-to-an-app/my-fitness-from-spreadsheet-to-an-app-15.png"/></figure>
<p>In the interest of brevity, I’ll stop right here. There are other things powering this pipeline which I’m still refining and perhaps can talk about later: male vs. female benchmarks, age-based adjustment of strength and fitness metrics, smart movement aggregation for practice skill screen, logging import errors like movements that don’t match in our DB, or a smart system of retrying LLM when parsers fail.</p>
<h3>End goal</h3>
<p>Now that I’ve gotten here, I can’t help but wonder: <strong>what’s next</strong>? and <strong>what’s the end goal</strong>? I can now replace spreadsheets with this app but it doesn’t solve all of my use cases. The dream would be to have an app that <strong>can track all of my workouts</strong>. This means:</p>
<ul>
<li>
<p>It needs to be a native (mobile) app</p>
<ul>
<li>
<p>Web apps are great but when in the gym and on the go—let’s be honest—we all prefer native apps.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>
<p>Replace SugarWOD completely?</p>
<ul>
<li>
<p>PRzilla is able to do this by parsing previous data but what about future one?</p>
</li>
<li>
<p>I would need to either:</p>
<ul>
<li>
<p>Implement SugarWOD API integration that’s tied to a box directly.</p>
</li>
<li>
<p>Implement some sort of image recognition of a WOD (snap a TV in your box) that can then be logged directly into our system.</p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Allow custom sets and reps logging</p>
<ul>
<li>
<p>This is a big one… and it would allow me to switch completely away from Strong app.</p>
</li>
<li>
<p>But first… I’ll need to port Strong app data into our system (perhaps more on that in later posts!)</p>
</li>
</ul>
</li>
</ul>
<div class="footnote" id="footnote-1"><sup>1</sup>
<p>Alex Viada came out with <a href="https://www.goodreads.com/author/list/13851793.Alex_Viada">Hybrid Athlete</a> around the same time.</p>
</div>]]></content><author><name>kangax</name></author><category term="other" /><summary type="html"><![CDATA[My Fitness: from spreadsheet to an app My fitness journey—as is the case with many teenagers—began with bodybuilding. I wanted to look good. Soon after, I found StrongLifts 5x5 and got into powerlifting. It became all about numbers: getting bigger bench, bigger squat, bigger press. Yet, I’ve always been drawn to the notion of Total Athleticism, as coined by Max Shank in one of the articles on T-Nation that I used to read religiously around 20151. Having a 300 bench was cool but I didn’t want to be one of those powerlifters who had massive numbers yet couldn’t run up the stairs. I wanted to also be good at running, calisthenics, kettlebells. Eventually this brought me to “functional fitness” and, of course, CrossFit, which popularized it circa 2000. CrossFit standards In my fitness circles, CrossFit was still criticized for its reckless high-skill olympic movements performed at high intensity. Blame the epic fail videos of someone doing something stupid and the ignorance around the methodology. While I was on the offense about doing actual CrossFit, I loved the “variable movements” concept. I found a couple of “crossfit athlete standards” posters online and made this spreadsheet to track my progress across multiple domains. It immediately exposed all my gaps: I could squat 2x bodyweight but my snatch was at a measly 100lb and all the speed and work capacity tests were barely at level 2: If I wanted to be an all-around developed athlete, these were the things I had to work on. The standards also served as an “objective” benchmark. To consider yourself “advanced” here’s how many pull-ups you had to be able to do; and this is how fast your 1 mile run would have to be. It gave me a concrete goal to work towards. These spreadsheets became my north star for the following few years. For a challenge junky like me, they were a perfect long-term obsession. Strength and Skill The spreadsheet overload was real. This wasn’t the first one I used. As far back as 2011, I found exrx.net Strength Standards and created this view to understand where I stand strength-wise and what to work on: In the last couple years I started tracking my frequency and total-lifetime-session-count of certain movements I wanted to be better at — a concept I wrote about before: Finally, I tracked my proficiency levels on various CrossFit -specific movements as a way to advance my skill and become fluent in them during WOD’s. One app to rule them all The year was 2025. I was a software engineer.And I would still manually update a spreadsheet with the number of times I’ve performed a certain movement that I deemed as “needed practice“. This was embarrassing. When I embarked on building PRzilla, I realized that perhaps this was the time to ditch manual spreadsheet tracking. I could now build an app that would have all of this backed in: show your fitness level across multiple movement patterns/domains (strength, endurance, gymnastics, work capacity, etc.) show your raw strength benchmarks (squat, deadlift, snatch, push press, etc.) show your skill proficiency as a “lifetime sessions performed” if you’ve done ring muscle-ups only 20 times in your life, you’re unlikely to be better at them vs. someone who has done them 120 times show your skill ownership as a “max consecutive reps able to do“ being able to do 50 consecutive kipping pull-ups means you own them; this movement is unlikely to be your limiting factor in any WOD that has them Whoop, Apple Fitness, and the rise of quantified fitness I use Whoop and I absolutely love how it’s able to distill complex/boring HRV/RHR metrics into simple, quantified scores like recovery and strain. Whoop and Apple Fitness—that’s just as big on quantifiable fitness—were a big motivation for this app. On the other hand there are apps like BTWB which is one of the most extensive Crossfit-style workout tracking tools, but I found its UI unintuitive and UX clunky: A snapshot of your fitness And so I turned all my spreadsheets into a simple snapshot consisting of 5 views: your level, balance, strength, ownership, and practice. These could be easily extended in the future with any other modules: time domain distribution, specific goals tracking like work capacity or endurance. Or even sport-specific ones like Hyrox. SugarWOD parser In order to turn all my workout data into beautiful charts, I needed to… have that data in the first place. One issue was that it was split between: SugarWOD — scores of WODs prescribed by my box that I did wodwell.com — common WODs that I did on my own Strong app — traditional strength training workouts that are not WODs (aka sets and reps) Importing wodwell scores was easy since it was just a map of common wod (fran, murph, etc.) to a score. Strong app export would be a lot more involved since I would have to implement sets and reps tracking (as well as workout sessions, potential rest values, and so on). So I decided to focus on SugarWOD import. And this is where the fun began.Good news: SugarWOD allows easy export of all of you workout history.Bad news: SugarWOD data is very… unstructured. Thanks for reading Juriy’s Substack! Subscribe for free to receive new posts and support my work. Here’s an example of CSV: 09/14/2022,WOD,24 Minute AMRAP:Row 240m12 Lateral Burpees over Back of Rower48 Double Unders24 Alternating Front Foot Elevated Reverse Lunges (53/35)*,3.073,3+73,Rounds + Reps,,"[{""rnds"":3,""reps"":73}]",,SCALED, As you can see, we have an arbitrary, potentially non-descriptive wod title like “WOD” plus gobbled up, plain-text description like “24 Minute AMRAP:Row 240m12 Lateral Burpees over Back of Rower48 Double Unders24 Alternating Front Foot Elevated Reverse Lunges (53/35)*” that’s missing basic formatting / newlines. As humans, we’re able to quickly parse this into: 24 Minute AMRAP: Row 240m 12 Lateral Burpees over Back of Rower 48 Double Unders 24 Alternating Front Foot Elevated Reverse Lunges (53/35)* Thank god we live in the age of LLM’s which are capable of reasoning through a messy jammed up text like this just like we—humans—do. Another peculiarity was load-based entries. In SugarWOD you can program them in a workout and specify sets and reps, e.g. 5 sets of 3 snatches. Users can then log a value for each of the 5 sets. In order to present your performance on the leaderboard, SugarWOD allows coaches to specify how to score those sets — max value (who got the highest weight)? lowest value (who got the fastest row time)? sum of all values (who did the most work overall)? and so on. The export doesn’t expose this scoring criteria so parser needs to infer it based on the sets data. In the example below, we can see that the scoring was using SUM of 12 sets and so 695 is not the weight user did as a 1RM squat snatch; the real squat snatch values are in the sets field: 05/31/2024,WOD,12 ROUNDS:30 Second CAP:3 Toes to Bar2 Lateral Barbell Burpees1 Squat Snatch*REST 1 Minute.*Increase weight as able.,695,695,Load,,"[{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":55},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":60},{""success"":true,""load"":65}]",,RX, In this case it’s “obvious” that 695 wasn’t a 1RM snatch (current world record is 496lbs) but some cases are much less obvious so the parser needs to be very careful there. LLM-powered pipeline And so after many weeks of experimenting, refining, rewriting, and adjusting based on real data (thanks to amazing volunteers in my gym), I now have a pretty smart and capable pipeline that turns unstructured SugarWOD data into a structured PRzilla data: One of the biggest findings—and things that slowed me down—was realizing that a giant, monolithic LLM prompt we used to generate giant JSON with a dozen of different fields (gpp, modality, difficulty, benchmarks, classification, etc.) was taking way too much time, was way too expensive, and often produced errors as it tried to do too many things at once. Parallelization for the win I then switched to a series of small, targeted LLM parsers/prompts—as seen on the diagram above—for each of the metrics and ran them in parallel. The results were astonishing: faster and cheaper execution and much more accurate results. This also gave me flexibility to run only specific parsers in specific cases; e.g. when parsing your historic data we want to extract movements (to feed it into our proficiency metrics), performance levels (to understand how your fitness level progressed), time domain (to see a time domain breakdown), and so on. We don’t care about coaching/scaling/stimulus module since the workouts are in the past and users don’t need to know that! However, those modules are important for new workouts, when using analyze or generate. Finally, it allowed me to run these parsers in parallel which meant that a WOD analysis was now taking time_of_slowest_module (usually ~12-15sec) rather than sequential SUM(module1, module2, …) that would usually take up to 40 sec! Unstructured to structured The end result is incredible. We’re able to turn a textual mess like this, into an actual workout and your actual performance. Here we see that 14min AMRAP was properly parsed into movements like “Wall Walk” and “Front Squat”; that it’s an endurance and stamina -heavy workout (yep!), that it’s classified as “Very Hard” and its modality are equally “Gymnastics” and “Weighlifting”. Moreover, AI determined that user’s score of 80 falls right around L3 (which we would likely adjust to L3.5 or L4 due to workout’s difficulty): Parsing “Wall Walk” as a movement is what allows us to count that towards your practice score! Notice that we now know that you’ve done “Wall Walk” 32 times in your life with the recent one being 6 months ago. Now that we have this structured data, the possibilities—all of a sudden—are endless. We can easily, and more importantly, automatically show your strength levels: powerlifting, weightlifting, crossfit total: We can derive how good you are at Endurance, Stamina, Power and other GPP components based on your scores on WODs that are high in those: Because we’ve determined time domain of all the wods you’ve ever done, we can show if you’re leaning towards shorter or longer ones. Yes, parsing 1300 entries is expensive but at least we can marvel at the end result 😅. Here is coach Mike’s real data dating back to 2018. You can see that early years prioritize short WODs (&lt;12min) whereas last couple years the focus has shifted towards longer, HYROX-style ones: And, of course, we have ability to see all the WODs for any given movement (why it’s so important to parse those for all the custom WODs and create proper associations). Here you can see that Mike has done over 232 lifetime front squat sessions over 8 years, 157 as dedicated lifts and 75 as part of WODs: In the interest of brevity, I’ll stop right here. There are other things powering this pipeline which I’m still refining and perhaps can talk about later: male vs. female benchmarks, age-based adjustment of strength and fitness metrics, smart movement aggregation for practice skill screen, logging import errors like movements that don’t match in our DB, or a smart system of retrying LLM when parsers fail. End goal Now that I’ve gotten here, I can’t help but wonder: what’s next? and what’s the end goal? I can now replace spreadsheets with this app but it doesn’t solve all of my use cases. The dream would be to have an app that can track all of my workouts. This means: It needs to be a native (mobile) app Web apps are great but when in the gym and on the go—let’s be honest—we all prefer native apps. Replace SugarWOD completely? PRzilla is able to do this by parsing previous data but what about future one? I would need to either: Implement SugarWOD API integration that’s tied to a box directly. Implement some sort of image recognition of a WOD (snap a TV in your box) that can then be logged directly into our system. Allow custom sets and reps logging This is a big one… and it would allow me to switch completely away from Strong app. But first… I’ll need to port Strong app data into our system (perhaps more on that in later posts!) 1 Alex Viada came out with Hybrid Athlete around the same time.]]></summary></entry></feed>