A shopping list for a catamaran: start from what people refuse to do
The app is at shopping-list.val.run and the code is on GitHub.
On a catamaran trip around Sardinia with friends, we needed one shopping list for the boat. Everyone had to be able to add to it, and whoever was in the shop had to tick things off as they went. The group set the requirements: no logging in, no accounts, and changes showing up on the other phones straight away. It just had to work.
Half an hour later, deployment and fixes included, it did.
The requirement decided the design
“No accounts” sounds like a missing feature. Here it decided the architecture. Without accounts the link itself has to be the access: opening the page creates a list with a random address, and anyone who has that address can read and edit it. You share it like any other link in the group chat, and nobody installs anything or waits to be invited.
That is a deliberate trade. Anyone who gets the link has full access, which is fine for milk and eggs among friends and would be wrong for a customer record.
Two problems worth the half hour
Two phones can change the same item at once. Say someone in the shop ticks off the cheese while someone on the boat renames it to “cheese, the hard one”. If the last request simply wins, one of those edits disappears. So each field of an item (name, position, ticked, deleted) carries its own timestamp, and the server merges changes field by field, which keeps both edits. If both people change the same field, the later write still wins; on a shopping list that costs one wrong tick. Phone clocks also drift, so each phone’s clock catches up with the latest timestamp it has seen from the others, and a phone a few minutes behind does not lose every conflict.
Without accounts there is also no “delete my data” button, so the list cleans up after itself. A list nobody opens for a week expires, and the rule lives in the code.
The agent deployed it
An AI agent wrote the app and deployed it to Val Town through Val Town’s MCP server, which gives the agent tools to create, edit and run code on the platform. I described a change, the agent edited the file, and the new version was live seconds later. The project’s history on Val Town has twenty versions from that day.
Takeaways
The order of decisions carries over. Start from what users refuse to do (here: create accounts), build the smallest thing that removes that friction, and say out loud what you skipped. For this list that means access control, rate limits, backups and tests. In a company each of those is a requirement. An agent that can deploy in seconds makes it even more important to decide up front where it is allowed to deploy and how a change gets rolled back.
The app is at shopping-list.val.run and the code is on GitHub.
