Photobooth
A full DIY photobooth system with a web UI, API backend, and custom hardware controls.
The Story
A friend asked me if I could build a photobooth for an event. Not rent one — build one. I figured, how hard can it be? Turns out it's actually a pretty fun project that touches everything from web development to microcontrollers.
The result is a four-component system: a web UI that runs on a tablet or screen, an API backend that handles the logic, a physical button panel with an Arduino and OLED display, and a serial bridge that connects the hardware to the web app over WebSockets.
The Architecture
The system has four repos, each handling a different piece. They all talk to each other, but they're cleanly separated so you can swap parts out or run them on different machines.
The UI
Built with Angular 18, this is what guests see on the screen. It shows a live camera feed, handles the countdown animation when someone takes a photo, displays the result, and lets people browse through the gallery. It connects to the serial bridge via WebSocket to receive button presses from the hardware panel.
The API
A Python Flask backend that handles photo storage, user sessions, event management, camera control, and even a licensing system. It stores everything in a database and provides a REST API that the frontend consumes. There's also a printing endpoint — because what's a photobooth without instant prints?
The Serial Bridge
This is a small Python script that reads from the Arduino over a serial connection and forwards the button presses to the web UI via WebSocket. It's the glue between the physical world and the browser. Dead simple — maybe 50 lines of code — but essential.
The Hardware
An Arduino sketch running on an ESP board with four physical buttons and a small OLED display. The buttons handle taking photos, navigating the gallery, and confirming actions. When you press a button, the OLED shows feedback and the Arduino sends the keypress over serial to the bridge. It's wired up with simple pull-up resistors — nothing exotic.
How It All Connects
Guest presses a physical button → Arduino sends a key over serial → Python bridge reads it and broadcasts via WebSocket → Angular UI receives it and triggers the countdown → photo is taken → API stores it → UI displays the result. The whole round-trip feels instant.
What I Learned
This was one of those projects where everything is straightforward individually, but making it all work together reliably is the challenge. Serial connections drop, WebSocket reconnects need to be handled, cameras behave differently across browsers, and you need the whole thing to just work for hours at a party without crashing. It taught me a lot about building resilient systems at the edge.
The project is closed source since it was built for a specific use case, but the architecture could easily be adapted for other interactive kiosk-type setups.