# All Pass

Stop digging through Photos and emails for your tickets.

## The context

Concert tickets are the worst offenders. Most venues don't issue a `.pkpass` file, so the QR code ends up as a screenshot buried in Photos or a PDF lost in an email thread — and I'd be digging through both at the door while the line backed up behind me. Gym passes and loyalty cards have the same problem without the deadline pressure. Most wallet apps solve this by asking for an account, a backend, and a reason to keep notifying you. I wanted the opposite — something that just holds the codes I already have, opens instantly, and doesn't talk to a server at all.

So I built All Pass as a single HTML file. No framework, no build step, no sign-up. Scan a code with the camera or import one, and it's saved to the device — installable as a real app icon with no address bar once it's added to the home screen.

![All Pass demo](/img/projects/all-pass-wallet/all-pass-demo.mp4)

## What it does

- Scans QR and barcodes with the device camera and renders them full-screen for re-scanning at a gate or till
- Stores everything locally, with export/import as JSON for backup and device transfer
- Installs as a Progressive Web App on iPhone, Android, and desktop, so it opens like a native app instead of a browser tab
- Ships light and dark themes, tokenized end to end, and a service worker tuned to avoid stale cached UI

## _

<!-- layout:grid-fullwidth -->

![All Pass showing up in iOS Spotlight search after being installed](/img/projects/all-pass-wallet/mockup-7.png)

![All Pass dark mode](/img/projects/all-pass-wallet/mockup-4.png)

![All Pass dark mode](/img/projects/all-pass-wallet/mockup-5.png)

![All Pass dark mode](/img/projects/all-pass-wallet/mockup-6.png)

## Why it's a playground project

It's deliberately small in scope and large in constraint: one file, no dependencies, offline-first. That rules out the usual shortcuts — no component library for the theme system, no router for the category filters, no bundler to split code, so the entire app ships as one ~14,000-line HTML file the browser parses top to bottom. The cost shows up at edit time: changing one CSS token means re-checking every place a color was hardcoded before the tokens existed. The payoff is a PWA with zero install step and zero dependency to go stale.
