Scan, sell, sync later.
A point of sale for event stalls: upload a spreadsheet of stock, print one QR per item, scan sales on a phone and watch stock and revenue update, even when the network drops.
- Nov 2025Built and used
- 0Duplicate sales, by design
- 30 sBackground sync interval
- 5Retries per sale, with backoff

Product developer
Built for stalls selling plush toys at events, where the Wi-Fi is the first thing to fail. The phone records every sale locally first and the server is made so a retry can never count a sale twice.
- Spreadsheet upload, CSV or XLSX, that updates existing items and creates new ones
- Printable QR sheets generated on the server
- A phone scanner page that logs each scan as a sale
- Dashboard for sold, remaining and revenue
- The offline-first layer: local storage, sync engine and idempotent API
A sale, offline-first
Every scan is safe the moment it happens, and the server sorts out the rest when the network returns.
- 1Scan the QR
- 2Save the sale on the phone
- 3Queue as pending
- 4Sync in batches of ten
- 5Server checks the client ID
- 6Stock and revenue update
- 7Marked synced
What it does
- 01
Upload stock
Drop a CSV or XLSX of items; existing ones update, new ones are created.
- 02
QR sheets
One printable QR per item type, encoding only its ID.
- 03
Phone scanner
A camera page on any phone, scanning through WebAssembly for speed.
- 04
Live dashboard
Sold and remaining per item, and revenue totals.
- 05
Works offline
Sales are stored locally with a status of pending, syncing, synced or failed, and the UI shows the queue.
Stack
- App
- Next.js 14 App Router, TypeScript, Tailwind CSS.
- Data
- PostgreSQL with Prisma; IndexedDB on the phone.
- QR
- qrcode on the server, zbar-wasm in the browser.