Case study · Product

ClickBox Photobooth: Kiosk to Gallery

A Windows kiosk app, a FastAPI backend, and a guest gallery running across a fleet of booths at live events, each device authenticating as itself.

Role
Founder, built and runs it
Company
ClickBox
Period
2024 – Present
Stack
C# / WPF · FastAPI · React · Next.js · PostgreSQL · Redis · Cloudflare Access

Every ClickBox event has a physical kiosk running a Windows desktop app, talking to a backend that has to stay correct under conditions a normal web app does not face: unreliable venue Wi-Fi, machines that are not always online, and guests who want their photos right away. I built it for my own events, with AI-assisted tooling, and I run it at every one of them.

BoothC# / WPF kiosk appRuns on site, captures photos and video, and talks to the API over a Cloudflare Access service token. No shared password on the device.
BackendFastAPI, Postgres, RedisEvent management, session state, and a cache sized for kiosk fleet load.
DeliveryGuest gallery (React and Next.js)Per-session photo pages and per-event galleries served from one origin, with share metadata set per event.
Security

One device, one identity

Each kiosk authenticates as itself with a Cloudflare Access service token scoped to that device, so the three booths never share one API key. A lost or compromised kiosk can be revoked on its own without touching the others. The admin dashboard, used by a person in a browser, sits behind a separate session-based Access policy.

Delivery

One gallery instead of two

The gallery serves a booth’s per-guest session pages and the per-event galleries the automation pipeline publishes, from the same origin and the same static asset store, so there is one thing to operate. That meant reconciling the pipeline’s manifest format with what the gallery frontend expected.

Operations

Secrets rotate on a schedule

Kiosk-facing secrets rotate on a fixed schedule, with a written runbook and an automated reminder. A fleet of devices at live events is where a forgotten rotation turns into a booth going dark mid-event. Kiosks go offline and venues have bad Wi-Fi, and a guest waiting for a photo does not care why, so the whole platform is built to keep working when parts of it cannot.