A note before this starts moving:
Been quiet here for a few weeks — heads down building instead of writing about it, which is exactly the trap this devlog exists to prevent. So: catch-up first, then this becomes the actual habit. One running post, edited in place every time I do real work, newest bit on top. No pile of unpublished drafts allowed after tonight.
Aug 11–16 — Not a build week: fine-tuning the plan with Melanie
Build hasn't been happening because Melanie and I are fine-tuning the planning — a call to pressure-test the app's direction before more of it gets built. Nothing shipped, nothing to demo yet. Next real checkpoint with her is Aug 25.
The day after that call I flew to Amsterdam, already on the calendar and not exactly restful timing. So the last few days have looked like: read what got proposed while I was in transit, ratify or correct it, repeat, jetlagged. Slower than a build day. Still real work.
Aug 10 — A property test catches a quiet undercount; CI lands
Property testing wrapped up on the plan engine — recovery weeks, peak placement, taper. (Quick definition since it's not unit testing: instead of me picking a few example inputs by hand, the test throws hundreds of randomized ones at the code and checks that a general rule never breaks.) One of the new tests caught something I did not want to find: the function that estimates how many weeks a plan takes has been quietly wrong since the day it was written. It assumed the training ramp always grows at its fastest allowed rate. It never has — a decision I made weeks ago about how midweek sessions scale means a slower cap kicks in first, every time, not just on rare edge cases. It also forgot to count week one, which doesn't ramp at all. Both mistakes lean the same direction: undercounting. Which means a plan could get waved through as "fine" while quietly falling short of the fitness it promised to build. Not a fun bug to find. A good one to find with a robot instead of a knee.
CI also landed, finally: typecheck, lint, and tests now gate every pull request. It immediately found four pre-existing security holes in dependencies I didn't write, fixable only by a framework upgrade spicy enough that I'm sitting on it rather than clicking go. Also, two people submitted essentially the same CI pipeline within hours of each other — an outside contributor and a parallel session of my own — so I got to experience the mild chaos of reviewing my own duplicate PR.
Also also: a friend looked at the app and told me the background needed more personality. So she hand-drew one — mountain, stream, evergreens, a trail, a tiny hiker — and delivered it in person like an actual patron of the arts. I tested it behind a real plan screen before getting attached to it. Verdict: fun illustration, bad background generated from it. Filed as a decision, not shipped as a component. I'm going to speak to a designer friend to really help me come up with something great based on this concept.
Aug 2 — Eight tasks in four hours; the baseline rule that punished a beginner for being honest
Eight tasks in about four hours, which blows through my own "one task a day" rule badly enough that I'm not even going to pretend otherwise. Most of the deterministic plan engine got built in one sitting — effort math, baseline interpretation, feasibility, week generation, route matching — then I abandoned property-testing mid-task and built the intake form instead, because I wanted something real to put in front of Melanie Michaelchuk before Tuesday. The bill for moving that fast: five judgment calls are sitting in the decision log waiting on me to actually stand behind them, and if you'd asked me that night, I could not have defended all five off the top of my head.
Here's the one worth telling. The baseline test hike is supposed to size itself conservatively for someone starting from nothing, with a floor so week one never asks too much. For my most sedentary test persona, that floor turned out to be doing something sneaky: her own honest report of an easy walk landed below it, so the app quietly handed her a bigger test hike than she'd actually asked for. Then, because the rule reads a hard outing as proof she'd underestimated herself, one rough day out made her whole plan meaningfully harder — off a starting point that was already inflated. The weaker the user, the worse it got. That's precisely the opposite of what the rule was supposed to do, and I only caught it because I had Claude run one specific beginner's numbers by hand. Fourth spec bug in as many days, and every single one turned up the same way: not by reading the rule, by actually running it on a person.
Jul 29 — Paired with Peter, six tasks land; CJ asks for a plan and outranks my own gate
Peter and I hopped on a Google Meet, screen shared, and built for ninety minutes — him, me, and Claude, which I've decided officially counts as a mob. He's a friend volunteering his time, and he does DevOps professionally, so I'd sent him an infrastructure one-pager the night before specifically asking him to find the holes in it. Six tasks came out of that sitting: schema migrated, seed pipeline written, real data loaded (fifteen Washington trails checked against WTA's own numbers, eight urban hikes, ten stair spots, six workout templates), a soft-delete flag, and the app's actual first page — /routes, all thirty-three seeded routes with real computed effort, several honestly tagged "estimated" instead of pretending to be exact.
Then, separately, my friend CJ texted: he's through-hiking the Enchantments in a few weeks, could I build him a plan. That one text reordered the roadmap. I'd shelved the app's biggest feature — generating a route from wherever you actually are, instead of picking off a curated list — all the way out to a future version, even though it's the thing basically every doc I've written about this project calls the actual point. It got promoted on the spot. CJ needs a plan, not a map, so now it's: finish the core engine for him first, then build the location-aware stuff before any stranger ever sees this thing. First time an actual human has outranked my own plan.
Jul 25 — Domain picked, first deploy: it's live and does absolutely nothing
The empty scaffold is live on the internet. I picked the shorter of two subdomain options (life's too short to type the long one), pointed a DNS record at the hosting platform, connected the repo, and deployed. SSL just... issued itself. The site loaded with a padlock and the default framework starter page, and that padlock is currently protecting nothing of value whatsoever. The task was "every merge lands on a live URL" — and now it does. Same night the database got wired in too, health-checked against both local and production.
Going in, I'd pictured domain setup as roughly "making a subdirectory." It is not that. The registrar just holds a single DNS record pointing somewhere else entirely, and I don't actually know much about DevOps, which I felt very acutely tonight — double- and triple-checking every field before clicking anything, the exact caution I'd want from a contractor I'd hired to do this instead of me.
Jul 18 — Accounts night: the best spend cap is money you've already spent
Accounts night: hosting, database, and an API key, all set up in one sitting. One genuine decision fell out of it — the database provider locks in its Postgres version the moment you create the project, so production ended up dictating local dev's version instead of the other way around, which is not what the plan assumed.
Better find: my own build plan told me to set a hard monthly spend cap on the LLM API, "not just an alert." Turns out you can't actually configure that directly — but you don't need to, because new API accounts run on prepaid credit. So I bought $20 of it and turned auto-reload off. That's the entire safety mechanism now. If something ever hammers the one AI feature this app has, it burns through the credit and the API politely stops answering. No setting I could configure beats money I've already spent and can't spend again.
Jul 14 — Planning day becomes build day one
A planning morning turned into the first build day, which is how basically every ambitious plan I've ever made actually goes. The morning went into the knowledge base the whole build runs on: spec docs, security and UX guides, backlogs, a decision log. Biggest call to fall out of it: maps are back in the MVP after all, staged as a ladder from "show a curated map" up to the real location-aware route generation I actually want, with the scarier rungs deliberately parked behind real user feedback. Then, in the afternoon, the actual building started — repo scaffolded, running locally, contributor guide written.
Best part of the day: I was seriously about to plan out paying people to walk around cities counting staircases for me, mechanical-turk style. Then it turned out the city already publishes its maintained stairways as open data, and a mapping project already tags every staircase with a step count. The exact data I was about to pay strangers to go collect had been sitting in a public dataset this whole time. New rule: check if someone already did the work before you pay someone to do it again.
Top comments (0)