TORSDAG
2026-07-30

Too many projects, too many ideas, too few hours — one learning a day anyway

Dev diary — 2026-06-08

Big build day, all of it on A Wine App — twenty-two commits and about +3.4k lines, most of it new code.

The morning went into a new brain for the home screen: a pure decision engine — input in, screen plan out, no async, no network — plus fifteen unit tests covering every hero path and shelf rule. By nightfall, most of those files were deleted. The quick-actions rail got ripped out, and the model and composer I’d written that morning went with it. Judging by where the commits ended up, the day’s real winner was a single card: Tonight’s Bottle.

That card changed direction twice. First I found the collapsed “what’s tonight?” gate was hiding the recommendation every single session, so I made the bottle show immediately with a skip option. Then I added food pills — fish, meat, pasta, cheese — and flipped it back: the card now asks first, and the bottle only appears once you’ve said what you’re eating, re-picking as you switch. A new food-affinity engine scores wines against the food instead of leaning on a hard-coded enum.

The other half of the day was a timestamp bug hunt in the wine database. The last-scraped column is plain text, and two code paths wrote timestamps in slightly different formats — under lexical comparison a . sorts below a Z, so freshly scraped offers looked ancient and the stale sweep killed them. Related: when the validator’s circuit breaker tripped partway through a shop’s catalog, every offer it hadn’t reached got marked dead. Verified offers now get touched up front. And three shops were sending flat payloads the normalizer silently dropped, so their offers landed with no shop attached.

Tonight: build 130 is out with the new Tonight’s Bottle flow, and the scraper pipeline has finally stopped eating its own offers.