2026-06-24 · Engineering notes · NextHaul
Every road leads to one funnel
Six ways to add an item, one code path, plus a handful of small details that make a grocery list feel effortless.
§ One funnel for every input
Typing, voice, barcode scan, the share sheet, the home-screen widget, meal ingredients: every one of them flows through a single “add item” method. So de-duplicating and crediting who added what are written exactly once. When natural-language capture gets added, it slots in just ahead of that funnel, a new feature with no new code path and no schema change.
§ A list that learns your receipts
Snap a receipt and on-device text recognition reads it, then learns your household’s shorthand (it maps “bnls chkn brst” to chicken) so future scans are smarter. Categorization is careful too. It prefers the most specific match, so “green beans” lands in Produce and “water” never matches “watermelon.” The built-in dictionary always wins, learned aliases only fill the gaps, and fuzzy matches only ever suggest. They never merge two items on their own.
§ Designing races away
NextHaul designs the data so edit conflicts can’t happen. Two people editing different fields of the same item both survive, and a check-off racing a delete settles predictably (deleted wins for display, and undo brings the check-mark back). It’s the good part of a CRDT without the CRDT library. Prices get the same care, stored as raw cent-observations and averaged to the nearest dime, so numbers never drift.
§ One shared cart link, reused
Exporting to Instacart builds a “shopping list” page, and NextHaul caches its URL on the shared list using a fingerprint of the sorted items. Reordering the list doesn’t break the cache, and because the link lives on the shared row, everyone in the household reuses the same cart page. That fingerprint is the entire cache-invalidation strategy.