A big build day, almost all of it on A Wine App — twelve commits and around three thousand new lines.
It started with a document, not code: a deep dive rethinking what the Home screen should actually be. Before touching the UI I went sideways and ripped out the managed cloud database entirely, replacing it with plain local Postgres in Docker. The old cloud instance is decommissioned, the admin tooling runs locally now, and all the docs got rewritten to match. Less moving parts, no more cloud-specific plumbing.
Then the cleanup pass the rethink demanded. The home view model had one omnibus load function — I split it into named phases and deleted dead fields along the way. Three views each had their own private copy of journey-saving logic; that’s one shared method now. And two sommelier cards were living on Home and in their native screens, so they got evicted from Home.
With the ground cleared, the new stuff: a context-aware hero slot — if you’re at a known restaurant, asking about your cellar makes no sense, so the restaurant card takes over. The centerpiece is a “Tonight’s pick” card where the sommelier asks what your evening looks like before committing to a recommendation, instead of guessing. I also laid down typed contract models for the whole home screen, replacing flat observable arrays.
On the data side, a fix with a nice arc: one Danish shop’s wines were getting rejected at a 92% rate because the source returns country names in Danish. I fixed that shop, then realized eight shops have the same problem — so the translation moved into the central normalizer instead. Also squashed a bug where cached offers weren’t refreshing their timestamps and kept getting swept as stale.
Tonight: the database is boring again, the Home screen has a real plan, and the sommelier finally asks before it answers.