Live websiteWebsites & storefronts
Hyrum Winter Ball
A community dance's website and ticketing: QR tickets by email, check-in by phone.

Shown here: the public website and an empty reservation form. No guest names, ticket codes, admin screens or venue details.
Why it matters
One application runs the whole evening. Guests reserve free tickets on the event's website and receive a QR code for each one by email; on the night, volunteers scan them at the door with their phone cameras, while the organisers follow reservations and arrivals from a private back office.
- 01
Reserve in one form
Guests choose how many tickets they need; the server checks the per-reservation limit and the event's capacity before issuing them.
- 02
A QR code for every guest
Each ticket gets its own code, sent by email with a link to a page holding all of the reservation's tickets.
- 03
Two scanners, one entry
When two phones scan the same ticket at once, a single conditional database update decides: one admits the guest, the other shows “Already checked in”.
- 04
A back office for the night
Find any reservation, check a guest in or undo it, send reminders, export to CSV and watch arrivals through the evening.
The details
Open any part for the full story.
Features8
- Free reservations with a per-reservation limit and a total capacity.
- A ticket email for each reservation, linking to its page of QR codes.
- Reminder emails with signed links to confirm or change a reservation, a calendar file, and a daily sending cap.
- Check-in with a phone's rear camera, with a beep, a vibration and a colour for each result, and a short pause between scans.
- An installable scanner app for the door team.
- Admin: reservation search, check-in and undo, totals, CSV export, and bulk or targeted reminders.
- Arrivals charted in 15- or 30-minute steps, and follow-up after the event for guests who didn't come.
- A community ideas board, rate-limited against spam.
How it works
- Node and Express over SQLite in WAL mode, with a busy timeout so simultaneous requests wait their turn rather than fail.
- Check-in is one UPDATE that only matches a ticket not yet checked in; whichever scan changes the row admits the guest.
- Reminder links are signed with HMAC-SHA256 and compared in constant time.
- A plain HTML, CSS and JavaScript front end; the server runs in Docker with the database on a mounted volume.
Technology
- Node.js
- Express
- SQLite
- JavaScript
- SendGrid
- PWA
- Docker
Development notes
Why I built it
My part
Status and context
- Status
- Live
- When
- Jan 2026
- Kind
- Websites & storefronts
Who it’s for
The problem it solves
Screens
Winter Ball home page: “Welcome to the Winter Ball” in script over falling snowflakes and softly blurred dancing couples






