I Now Keep a Locker of Your Shoes

Your profile now has a gear locker: every pair you run in, with its mileage, its wear, and its personal bests. You can tag a shoe on any completed run, whether it is in my catalog of 258 shoes or not, and the mileage is never a stored counter — I recount it from your runs every time, so it can never drift.

A Locker on Your Profile

Your profile now has a locker. Every pair of shoes you run in gets a row: how many kilometres it has covered, how many runs, how many personal bests you set in it, when you last wore it, and how far along its life it is.

You can mark one pair as your default, so new runs land on it without you doing anything. And when a pair is done, you retire it rather than delete it. A retired pair keeps its history — the runs it carried and the PBs it earned stay attributed to it, and it still shows up on the runs it was worn for.

Tag a Shoe on Any Run

Every completed run can carry a shoe. On the workout detail there is a small chip naming the pair, and tapping it opens a picker: first the brand, then the model. The same choice sits in the manual log form, tucked into the optional details.

You do not need to set the locker up first. Pick a shoe on a run with an empty locker and I save it to the locker in the same step.

The picker is backed by my catalog, but the first lane in it is "Other", where you type the name yourself. That is on purpose. The catalog leans toward shoes from the last two seasons, and a real locker is mostly older than that — the pair you have been running in for a year does not stop counting because a catalog page does not exist for it.

Your Mileage Is Never Stored

The obvious way to build shoe mileage is a counter: finish a run, add its distance to the pair. I do not do that, and the reason is honesty about how running data actually behaves.

Your runs are not fixed once they land. An edit in Apple Health arrives as a delete and a re-add, so a run can vanish and come back. And a shoe is yours to reassign — you can move a run from one pair to another at any time, long after the fact. A stored counter has two independent ways to drift from the truth, and no way back.

So there is no counter. Every time you look at the locker, I recount: take your completed runs, filter them by pair, and sum the distances, plus whatever mileage you told me the pair already had when you added it. The number on the row is always derived from the runs it stands for. Reassign a run, fix a distance, delete a duplicate — the mileage simply follows.

A Catalog of 258 Shoes

Behind the picker sits a public catalog at /gear: 258 shoes across 28 brands, from daily trainers to carbon race shoes to trail shoes.

Each entry is placed on the same set of axes — category, surface, plate, cushioning, stability, price band, and what it is best for, from easy days to the marathon. Each one also gets a short honest write-up that says what the shoe is for and, just as deliberately, what it is not for: a soft daily trainer that turns vague at race pace says so.

Two rules keep the catalog honest. Every entry links to the manufacturer's own spec page as its source. And when a manufacturer does not publish a figure — stack height is the usual one — the field stays blank rather than being filled with a guess. A number under a source link has to actually come from the source.

Wear, and When to Replace

Each catalog shoe carries a lifespan estimate, and each row in the locker shows how far along that life the pair is. A pair from the "Other" lane gets a sensible default, and you can override the lifespan on any pair if you believe your shoes last longer or shorter than the estimate — it is your locker, not mine.

Why This Matters

Shoes explain runs more often than runners expect. A pair quietly past its life shows up as calves that ache for no reason. A race shoe worn on easy days disappears twice as fast as it should. And knowing that every one of your recent PBs came in the same pair is worth knowing before race day.

Now that is all in one place, kept honest by the same runs it describes.