Ops

Venue Wi-Fi drops.
Your queue can't.

Open the scanner once. Every attendee for your active events is cached to the device. Each scan resolves locally — instant, offline, no spinner. Check-ins queue in IndexedDB when the network dies and sync the moment it returns. The volunteer at Gate 2 never notices the outage.

Scanner · Offline
QR Scanner
1,247 attendees cached · 3 pending sync
📵 You're offline
3 check-in(s) pending sync
VIP
Aditi Rangan
Head of Growth · Razorpay · V-14
✓ Queued check-in (offline)
📷 Point camera to scan next

Four things that stop the queue from stalling.

📦
Pre-cache on open
A single request pulls every attendee for the tenant's active events — name, seat, category, company. Stored in IndexedDB keyed by QR token. About 400 bytes per row, 1 MB per 2,000 attendees.
Local resolve
Every camera scan looks up IndexedDB first. Attendee card renders inline — no navigation, no server round-trip. Works identically online or offline.
🔄
Queue & sync
Offline check-ins land in a second IndexedDB store. The browser fires online, the queue drains, each item POSTs to /checkin/{token}. Duplicate protection lives on the server.
🛡
Service worker shell
A registered service worker caches the scanner page + latest Vite bundle. Even a hard reload with no signal boots the app — the shell comes from cache, attendee data from IndexedDB.

Because the Wi-Fi at every third venue is a coin flip.

Real story from a college fest in Pune. Fest starts at 9 am, 3,200 pre-registered attendees, six volunteer scanners at three gates. Router at Gate 2 chokes at 9:07 am. Volunteers stare at the scanner spinner. Queue backs up 40-deep in under three minutes. Attendees start pushing past unchecked. Sponsor at the booth wants to know why nobody's coming in.

The organiser texts us. We push a fix in the next release: cache attendees on open, queue offline. Next event, same venue, same crappy Wi-Fi. Router dies at 9:11. Nobody notices for 22 minutes. When it comes back the badge at the top of the scanner reads "Syncing 47 offline check-ins" and clears in six seconds. Zero attendee complaints.

Table-stakes for anything at a venue you don't control. Bad conference centres, marriage halls with cinderblock walls, college auditoriums where the guest network is a router in a locked cabinet with 200 devices on it. Table-stakes.

Where offline matters most.

📱
Same scanner, same URL, same volunteer training. Offline is invisible until the Wi-Fi drops — then the banner appears and everyone keeps working.
🖨
Kiosk mode inherits the same cache. If the printer is on a separate LAN, badges still print — the check-in confirmation queues for later sync.
🎫
Apple / Google Wallet passes don't need our network to open — the QR is embedded in the pass. Combined with offline scan, the whole entry flow is network-free.

Questions we get

Does the scanner still work with zero bars of signal?
Yes. On open the scanner pulls every attendee for your active events and stores them in the browser's IndexedDB. Each scan resolves locally. Check-ins queue on-device and drain to the server the moment connectivity returns.
What if two devices scan the same attendee while offline?
Both queue locally. When they sync, the server marks the first through as the check-in and returns already_in for the second — the second device sees a warning on next refresh. No double check-ins get written.
Do I have to install anything?
No. It's a service worker inside the standard scanner page. Open the URL once online and the shell + latest bundle are cached automatically. Bookmark it to home screen for one-tap access.
How much data does the cache use?
About 400 bytes per attendee. A 2,000-person event caches in under 1 MB. Bundles + shell add another ~2 MB, one-time.
Can I refresh the cache mid-event?
Yes. There's a "Refresh" button next to the cache status. Tap it any time to pull the latest attendee list — useful after a wave of walk-in registrations at the door.
Stop apologising for the venue Wi-Fi.
See the offline scanner queue + sync in 5 minutes.