One call before every run
An iOS running coach that reads your recovery each morning and makes one call: run it, ease in, or back off. Designed and built solo in SwiftUI.
Before, not after
Every run starts with the same three questions. Am I recovered? What do I wear? What cadence do I hold?
Strava measures runs after they happen, so it can't answer those. Cado answers them before you head out. Each morning it reads your HRV, resting heart rate, and sleep, then makes one call: run it, ease in, or back off.
It's built solo and fully native: SwiftUI, SwiftData, HealthKit, Strava OAuth, and a live Claude coach. Every phone on this page is that real UI rebuilt in code. None of them are recordings.
What success looks like
I set three targets before writing any code, so the calls were decisions, not taste.
The race bib
Clean and data-forward is where every fitness app ends up, so I picked a real identity: the race bib.
Brand red is the field now, not an accent. Cream paper holds the data. Black ink drives the actions. One rule keeps it honest: red means action, nothing else. At one point the cadence number and a button were both red and fought for attention, so the number went to ink. One screen, one loud thing.
Thirty seconds to set up
Onboarding asks only what the coach needs: your name, your units, and whether you run hot or cold.
Five screens, one question each. Everything heavier waits. Strava, HealthKit, and the API key connect later in Me, once there's a reason to grant them. An app that asks for your health data before it shows you anything hasn't earned it.
Today: should I run?
Today answers one question at a glance: should I run?
It set a rule I kept reusing: recommendations live at the decision point, not two taps away in a menu. So the outfit call moved here. Tap it and every item shows why it was picked. Each reason is generated at the same branch that picked the item, so it can't drift from the logic.
Coach: a voice that pushes back once
The coach leads with your real numbers, explains why, and pushes back once if you're overriding a bad day. Then it defers, because you're the athlete.
It runs on Claude with your live recovery and 28 days of Strava load. The morning brief is capped at 50 words, because you read it standing in a doorway. With no API key, an offline version argues from the same evidence under the same rules. The voice is the product, not the model behind it.
Quiet when it agrees, loud when it dissents
The readiness call was placebo, so I inverted it.
It used to read "Run as planned, 57%" almost every day, because the math ran against a hardcoded baseline. Now it stays quiet when your numbers look normal, and gets loud when they don't, with the real numbers as evidence. I dropped the score everywhere, because a number you can audit earns trust and a tidy 87% doesn't.
Train: how do I execute it?
If Today answers should I, Train answers how.
The same four targets show up again, right where you act on them. Plus the one thing trackers skip: a metronome you actually run to. The cadence isn't a guess from a table. It's the median of your recent Strava runs, corrected for single-leg counting and shown as a range. It waits for three runs before it trusts itself, and it tells you where the number came from.
Warm up, cool down
The run is the middle. Cado owns the bookends too: a warm-up before, a cool-down after.
Each is a real routine you step through, not a checkbox. Tap one and you get the moves, the reps, and the time it takes. Most apps stop at the run. The injuries happen in what they skip.
Plan: 89 schedules you can scan
89 real schedules from Pfitzinger, Hansons, and Higdon, browsable instead of a wall.
You pick a distance first, then a plan family, with the mile and kilometer versions merged. So you're choosing, not scrolling. The week is a paper card you check off. To move a workout, you drag it in place instead of digging through a three-tap drawer.
Your week, checked off
Once you pick a plan, this is the screen you live in: your week as a paper card you check off.
Every day shows the workout and whether it's done. Tap a run to see the detail or move it. The seven-day bar up top is your week at a glance, so you always know where you stand.
Me: real data, honest errors
Nothing in cado is mocked. Strava, HealthKit, and the coach key all connect here, for real.
Wiring up real services taught me one rule: show the actual error, never fake a state. Same idea when data is thin, where it says "still learning your baseline" instead of guessing. The accessibility pass got the same care. An audit caught body text ignoring Dynamic Type in 124 places, and the fix was one file.
Deciding out loud
My fastest iterations came from asking the hard question out loud.
The gear feature went through three versions in a day. "What if they have 15 pairs?" grouped the list. "What if they don't know what a tempo shoe is?" replaced the jargon with auto-classification, so typing "vaporfly" picks Race day on its own. Knowing what not to build mattered just as much. No mileage odometer. A "recommended" arrow got cut the day it didn't read. Two audit findings got skipped because they didn't hold up when I checked them.
What I learned
Three things I'd carry into any product:
Personality is a layer, not a structure. Hand-drawn accents over a data-forward layout survived every version. Hand-drawn everything did not.
Evidence beats scores. A call you can audit earns more trust than a clean percentage. Show the number and where it came from.
Recommendations belong at the decision point. Advice that lives two taps away doesn't exist.
Home
Cado