Off the Shelf: shopping built for the island run
A household shopping companion built for how shopping actually works on Hawaiʻi Island.
The story in three parts
Stores in different cities
On Hawaiʻi Island the stores you need are in different cities, and generic list apps don't know which store an item is in or what survives a hot car.
Features taken from real lists
Per-store aisle-sorted lists, city-run planning, a purchase memory and in-aisle questions, derived from real shopping lists across four iterations.
Used once, not adopted
It has been used on one real trip and not since. On that trip it lost to the notes app in the aisle, because the list inside it could not be trusted.
The island run in 20 seconds
What the work turned up
Real lists decided the structure
Each iteration loaded an actual shopping list and let it decide what came next, instead of inventing features up front.
It broke in the store, not before the trip
Setup happened before leaving. In the aisle, the list inside the app could not be trusted, and the notes app won.
Every blocker was checked against the code
A store needed on every imported row, every imported item defaulting to keep cool, typed notes lost on leaving the app: each one verified in the code.
A shopping day is a city run
On Hawaiʻi Island, the stores you need are in different cities, so a shopping day is not one stop but a multi-store "city run" (a Kona run might hit Costco, Target, and Home Depot) followed by a long, hot drive home. Generic list apps ignore all of that. They don't know which store an item is in, which city you're driving to, what survives a hot car, or what the household already tried and disliked.
Who it's for
A two-person household sharing one account, one person shopping while the other adds items and answers questions from home.
What it does
- Per-store lists sorted by aisle code, and within a store the items marked heat-safe group first so perishables are bought last, right before the drive.
- City-run planning: pick a city and get a sequenced multi-store route.
- A purchase memory records what the household tried, liked, and rejected, so an aisle decision becomes "we had this, never again" instead of a guess.
- Two-way in-aisle questions: the shopper snaps a photo and asks, and the person at home can flag an item as photo-requested before it is bought.
- Household members with per-member reactions, staples with one-tap re-add, returns and errands, a "parked" status for the not-yet items, and a paste importer that ingests messy real-world lists.
How the features came from real lists
The feature set was not invented up front.
It was derived from real shopping lists across four documented iterations, each one loading actual data at the destination and letting it decide the structure.
- v1 was a generic scaffold.
- v2 added the real islands and cities, and made a city run, not a single store, the unit of a trip.
- v3 came after ingesting a real Hilo and Target list: household members, aisle-code sorting, staples, returns, and the paste importer.
- v4 came from a real Costco list: shopper instruction notes (brand, "only if not expensive"), the photo-requested flag, and the parked status.
The lesson is the method: structure was designed from real user data, loaded at the destination, never invented. Each list exposed what a generic app was missing, and that became the next round of features.
Built
Off the Shelf is a React 18 and TypeScript progressive web app, built with Vite and Tailwind on a Supabase backend and deployed on Vercel, so it installs to a phone's home screen. It was product-managed and specified conversationally, built autonomously by Claude Code, then given a distinct cool-violet visual redesign.
Design process
Off the Shelf has been used on one real trip: I shopped, and the other member of the household answered questions from home. I screenshotted each blocker as it happened, then checked every one against the app's code. These design artifacts start from that trip. Anything resting on assumption rather than evidence carries an (A) label, and the labels stay until interviews with other households replace them.
Outcome
A list the shopper cannot trust is worse than a plain one.
- Deployed and working, but not adopted. It has been used on one real trip and not since, and there is no usage metric.
- The reason is specific: on that trip it lost to the notes app in the aisle. The imported list needed a store typed on every row, marked every item keep-cool, and dropped notes typed before they were sent.
- The next iteration is scoped at trust in the list during the trip (import accuracy, sensible defaults, and drafts that survive leaving the app), not at more features.
Screens