The PaperMono on a fridge, showing a real shopping list grouped by aisle. Photo by the project’s author, Seamus Cawley, from the repository (GPL-3.0).
A fridge-mounted e-paper panel shows the household shopping list, grouped by aisle in the order you walk the shop, and switches its Wi-Fi on only long enough to sync — hourly, right after an edit, or on a tap if the list has gone stale.
The firmware runs on M5Stack’s PaperMono (the C153 variant, $65, which bundles LoRa and NFC radios this project never touches): an ESP32-S3R8 with 16 MB flash and 8 MB of PSRAM, driving a 3.97-inch 480×800 SSD1677 e-paper panel through an FT6336G capacitive touch layer, off a 1150 mAh battery. Taps and typing use fast partial refreshes with no flash; every tenth one forces a full black-and-white flash, because a long run of partial updates builds up ghosting that can permanently damage the panel.
Wi-Fi comes on only to sync: at boot, every hour, straight after any tick or add, and opportunistically on a tap if the last successful sync is more than five minutes old. The rest of the time the device is fully offline, queuing edits to flash until the next connection. The aisle order is set once, from the phone’s Aisles screen, and both the device and the phone follow it from then on. New item names can optionally be sorted into an aisle automatically — the self-hosted server hands never-seen names to the Claude Code CLI the first time it sees them, caches the answer in a catalog so each name is classified exactly once, and lets a hand correction teach the catalog for good. One environment variable turns the whole thing off if you’d rather file items yourself.
The server is a single FastAPI process over one SQLite file, deployable with a Docker one-liner or a systemd unit; the phone side is a plain HTML page, no app or install step. The project is unusually candid about its own edges: “it works, but it isn’t a product.” Wi-Fi credentials are compiled into the firmware rather than set from the device, the API has no authentication (keep it on the LAN, or behind an authenticating proxy), and only the one hardware variant the author owns, the C153, has been tested. Battery life hasn’t been measured either — the main loop polls touch every 20 ms with no light sleep between syncs, so the honest guidance in the docs is “days, not weeks.”
About 2,400 lines of C++, GPLv3, and upfront about its debts: the board bring-up, e-paper and touch drivers, keyboard layout and widget style are adapted from MonoMesh, andrecolz’s larger Meshtastic-compatible firmware for the same hardware. The sync protocol, offline store, screens and server are new.