The setup
Outdoors there's no reliable network, power comes and goes, and nobody on site is going to debug a Linux box. So scanners have to last days on a battery, gateways have to come back from a power cut on their own without losing anything, and the whole thing has to be watchable from one screen.
Scanners
nRF52840, Zephyr, RC522 reader. Each one joins the OpenThread mesh as a sleepy end device and polls its parent every 10 seconds, which gets it to about nine days on a charge. Scanners name themselves from their hardware ID.

Gateways
Several Pis as Thread border routers, and none of them is the server. Each runs a relay that swaps scans and peer lists with the others over the mesh, so any gateway has the full picture and losing one loses nothing. Anything reading from a gateway keeps a cursor and replays missed scans after a reconnect.

Things that went wrong
- The updater that emptied files. Gateways update themselves by checking the repo every minute. The first version reset the working tree on every check, and a power cut mid-reset left 89 files at zero bytes. Now it only touches the tree when the remote has changed, and swaps files atomically.
- Range. The stock radio dongle couldn't hold the mesh across the site. Building radio co-processor firmware for a dongle with an external antenna got 20 to 33 dB more link margin.
- Power. Gateways on battery backup only shut down after three readings in a row below 20%, so one bad sample doesn't take one offline.
Four gateways ran in the field.
The kiosk
The same idea as a product for a client: tap a wristband, get a clear yes or no. Pi 5, NFC reader, 3.5 inch touchscreen, LED ring, speaker and battery backup, in a seven-part printed enclosure generated from code.





It works offline. Every scan is written to a local SQLite store before the screen answers, with an outbox that drains when the network comes back. Staff settings are behind a PIN. The software and fleet tooling have 114 tests in CI.
Not shown
The code. This was built for a client and runs at real events, so it stays private. Two prototypes built so far. A collaborator wrote the battery and servo drivers.