Live websiteWebsites & storefronts

Hyrum Winter Ball

A community dance's website and ticketing: QR tickets by email, check-in by phone.

Hyrum Winter Ball: the snow-lit home page with the Winter Ball script title, and the Reserve Tickets form on a 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.

  1. 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.

  2. 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.

  3. 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”.

  4. 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

An early independent project, written before I worked with AI coding agents like Claude Code and Codex: a complete system, from the database to the door, built by hand.

My part

Sole builder, for the event's organisers.
Status and context
Status
Live
When
Jan 2026
Kind
Websites & storefronts

Who it’s for

Guests of a free community winter dance, and the volunteers who run its door.

The problem it solves

A free event still has to know who is coming: a ticket for every guest, a hard limit on numbers, and a door that lets each ticket in once, even with two volunteers scanning side by side.

Screens

hyrumwinterball.com
Winter Ball home page: “Welcome to the Winter Ball” in script over falling snowflakes and softly blurred dancing couples

Winter Ball home page: “Welcome to the Winter Ball” in script over falling snowflakes and softly blurred dancing couples

1 / 4