2026 · Built for UMich YSA

YSA Photo Booth

A shared camera for club events. Guests scan a QR code, take photos in their browser, and the photos show up on the projector a few seconds later. Nobody downloads an app.

Stack
Cloudflare Workers, R2, plain HTML and JavaScript
For
The Yemeni Student Association at the University of Michigan
Running it
One organizer page, no code
The wall, seconds later
The camera

Recorded on a local copy with my own photos standing in for a camera.

Scan, shoot, done

Scanning the QR code on a poster, or on the wall itself, opens the camera in the phone's browser, with no sign-in. The page draws the viewfinder onto a canvas at a fixed 1080 by 1350 crop and uploads that. Every photo comes out portrait and the right way up, at about 250 KB instead of a 4 MB original. Each phone gets ten shots. The wall checks for new photos every three seconds, and each new one holds the big tile for 25 seconds before older photos start rotating through it again.

No database

Everything lives in R2, and the object keys carry the state. Each photo is named with an ISO timestamp, so an event's photos sort by time, and the wall's feed is a list call that asks for anything after the last key it saw. Events and guest links are empty marker objects. There is no schema to migrate.

The link is the lock

Each event gets a random 20-character key, and that key is the only way into its camera, album, wall, and images. Turning a link off makes every page and image behind it stop working at once, and turning it back on issues a new key, so a QR code that leaked stays dead.

Anyone at the event can take a photo down, and it disappears for everyone except the phone that removed it. Organizers can restore take-downs in one click. Everything in the bucket is deleted 30 days after it's written.

Handing it off

The next social media chair isn't a programmer. After a one-time setup, the board runs it all from an organizer page: create an event, print the QR poster, moderate, and download the album. No terminal, no deploys.