Replaces the paper sticker on a roll of sailcloth with an NFC chip. Photograph the mill label, confirm what was read, write it to the chip. Tap the roll later to see what cloth it is, and enter cuts so the metres left on the chip go down.
Android · React Native · on-device, no server
On the chip
77 bytesTests
132Source
6.7k linesRelease APK
51.8 MBServers
0The record
The chip is the source of truth — there is no database behind it. The record is written by position rather than by key, and the mill, shade and grade are written as their index in a fixed list, which is what takes a roll from 215 bytes to 77.
[2,1,"Superlite 50",1,40,2,"6114308",150,40]An NTAG213 holds 137 bytes and is the sticker every shop stocks. The record fits it with room to spare, so the tag someone buys by accident is the right one.
The loft only needs what is left right now. Dropping history made the record a fixed size, so a write can only ever fail on the very first one.
Every write is read back and compared before success is shown. A half-written tag is never reported as written.
The flow
Three frames of the mill label, a fraction of a second apart.
Every field the reader was unsure of is signed off before anything is written.
Held against the chip, written, read back and verified.
Holding a phone to a tagged roll opens the app on that roll, even when closed.
The cut is saved to the phone first, then written to the chip — so metres survive a crash.
Reading a label
A laminated label reflects, and the glare moves when the phone does. Three frames rarely lose the same words; agreement raises confidence, disagreement forces a confirmation.
Fired at a glossy label it puts a hotspot exactly where the text is. There is a torch button instead, so the operator can see whether light helps.
ML Kit returns no per-token confidence, so it is inferred from how a value was found — anchored to a caption, right shape, unambiguous, free of letter-for-digit confusion.
A width misread as 1500 cm is a clean, well-anchored read of an impossible number. Confidence cannot see that; range checks can.
The Contender stencil reads M as H, so GROSS METERS comes back GROSS HETERS. The patterns expect it.
The label fills the frame, so more pixels buy nothing — and three full-resolution frames were enough for Android to kill the app.
Built with
Deliberately absent
Everything runs on the phone. The only network call is an optional JSON file of the loft's own ads, cached so it works with no signal and falling back to ads bundled in the app. Nothing identifies or tracks anyone — which is why there is no consent dialog and no privacy policy to write.
CSV export through the share sheet is the way out for anyone who wants more. It defaults to semicolons and comma decimals, because a comma-separated file lands in column A of a Danish Excel with the numbers as text.
Where it stands
Read, write, verify, cut, erase and the stock list, on an Android phone against real chips.
A locked tag, a write interrupted mid-flight, and a tag written by the other platform. Each needs a failure that has to be staged.
iOS. Entitlements, usage strings and the bundle id are in place, but Core NFC needs a capability no free Apple team has. $99/year, unavoidable.
Code shrinking would take 10–15 MB off the APK, but it strips code it believes unused and the NFC, camera and Nitro modules all use reflection. Worth doing once the feature set settles.