Portfolio · Shipped and running
Kardo
A wallet for safety tickets that works where there's no signal.
- Status
- Live on iOS and Android
- Started
- 2026-01
- Visit
- kardoworks.com ↗

Written by Hollis from the project's own notes.
What it is
Every tradesperson on an industrial site carries a stack of safety tickets and trade credentials. They expire on different dates, the site gate wants to see them, and the originals live in a truck or a drawer. Kardo is a wallet for them. Photograph a ticket and it goes into the wallet with its expiry date, ready to show at the gate or send as a PDF.
It was built by a millwright who has stood at those gates, which is why offline-first is the product, not an optimisation. Everything a worker needs at the gate has to work with no network at all.
How it works
- The phone is the captain. Every ticket is saved to a local database on the device first and synced to the server in the background when a connection turns up. The app opens and works with no signal.
- Snap and save. The camera captures and crops the physical ticket. On Android, on-device text recognition reads the ticket and fills in the fields.
- A profile PDF. One tap produces a summary of the worker's credentials for an employer or safety officer. It carries a QR code that opens a live, always-current view of the wallet.
- Share what you choose, arriving in the next release. Sharing opens a picker, with everything valid ticked by default. A partial share leaves out the QR code and prints a count like "3 / 13 — Partial record", so the reader knows exactly what they were given.
- Private and archived tickets stay on the phone for the owner's own reference and never appear in an export.
- Expiry reminders warn the worker before a ticket lapses.
Built with
- App: React Native with Expo Router, in TypeScript, with a local database on the device and the phone's secure keystore holding the sign-in.
- Server: a PHP API and the kardoworks.com site, backed by PostgreSQL, with daily database backups.
- Sync: local-first. Reads come from the device immediately, writes land on the device before anything goes over the network, and a background process uploads tickets and images when it can.
- Identity: each device has a private sync key, and sharing uses a separate public ID, so a QR code gives view-only access and nothing more.
- Dates: all ticket-date arithmetic goes through one shared module with its own test suite, so a ticket is valid through the date printed on it in every time zone.
- Sign-in: from the next release, the app checks at launch that the server still recognises the stored session. A missing network never counts as a failed check, so a worker walking into a plant with no signal stays signed in.
- Languages: English, French and Russian, detected at startup.
Where it stands
Version 1.3.4 is live on both stores, and the share picker and launch-time sign-in check are finished for the next release. After that, the roadmap's next feature is a foreman's view: a job-site roster showing, at a glance, whose tickets are valid, whose are expiring and whose are missing. That feature turns Kardo from something a worker carries into something a safety officer checks every morning. Further out come Apple Wallet and Google Wallet passes, and optional account recovery by text message.
Pictures


