A snag list you file from your phone
The locker that does not shut properly gets mentioned once, out loud, in the rain, halfway through something else. Nobody writes it down where it lives, so it gets rediscovered three months later as a surprise. Every workshop, rental flat, holiday house and boat has a list like that, and the list is in somebody's head.
I built the smallest thing that closes the gap at the moment it opens. It lives inside OpenBoat, my open-source skipper's layer, but nothing about it is boat-specific.
What it is
A Python process serves one page on the local network. You open the address on any phone that is on the same wifi, pick the thing the fault belongs to, photograph it, type one sentence, send. Ten seconds, standing where the fault is. The page appends one entry to a markdown file and copies the photo next to it. That is the whole feature.
## 2026-10-03 14:12 · Locker by the heads does not latch
**Status:** open
**Photo:** snags/2026-10-03-1412.jpg
**Unverified:** filed from a phone, not yet checked by anyone.
Door swings open on port tack. Striker plate looks bent.
Append only, on purpose
The function that writes the entry only ever adds a new heading at the end of the file. There is no code path that edits or reorders anything. A fault's status still changes, but it changes by hand, at a desk, by a person with a name: the line **Status:** open becomes **Status:** fixed, replaced the striker plate, 2026-10-12. Closing a fault is a deliberate act with a note attached, not a tap in a wet pocket.
The page that shows the open faults is a parser over that file, not a database beside it. If it kept its own copy, a fault you had just fixed and written down would still show as open, and a maintenance record that lies is worse than none. Anything the parser cannot make sense of is skipped rather than guessed at. An entry with no status line counts as open, on the reasoning that something somebody wrote down and never marked is not something anybody has closed.
The unverified line
Every entry carries a standing warning that it was recorded from a phone at the moment of noticing and confirmed by nobody since. That is the honest status of "the owner said so". It also makes the file safe to hand to an assistant, human or otherwise: a reader sees exactly how sure to be.
Why markdown and not an app
Because the file outlives the app. If I stop maintaining the page, the list is still a plain text file in a folder, readable on anything, searchable with grep, versioned with git if you like. The photo sits next to it with a date in the name. Nothing about the record depends on a server being up or a company existing.
If you want one for your own place: a form with three fields, a function that appends to a file and refuses to do anything else, and a second function that reads the file back. An afternoon, and the locker finally gets fixed.
