BS ECE · Carnegie Mellon · May 2028

zhaojinchu@cmu.edu github.com/zhaojinchu linkedin.com/in/zhaojinc


AN-011 · Fun · Finished
Started Mar 2026

HackberryPi: a retro digicam with a live gallery


1.0Abstract

A Raspberry Pi 4 and a camera module set up to behave like a 2004 point-and-shoot. It previews and captures on two streams so the shutter never freezes the screen, adds grain and chromatic aberration on purpose, and pushes each photo to a web gallery that updates on every phone in the room as soon as you take it.

At a glance

Parameter Value
Status Finished
When and where Mar 2026, personal project
Built with Raspberry Pi 4, Camera Module 2 or 3, an optional touchscreen; Python with picamera2, pygame and Flask; a systemd user service
Code github.com/zhaojinchu/HackberryPi
Capture Dual-stream: low-res preview and full-res capture, so the shutter never freezes the screen; tap the shutter zone or press space
Look 1920×1080 at JPEG quality 48 with grain, chromatic aberration and downscale artifacts on purpose; or clean 2304×1296 at quality 95
Gallery Flask with Server-Sent Events pushes each new photo to every open browser

The idea

A camera that feels like the one in a 2004 pocket: instant, slightly bad, and shared. The Pi does the capturing; a Flask gallery on the same board serves a page that updates live over Server-Sent Events, so everyone on the Wi-Fi sees the photo the second it’s taken.

Two capture modes

digicam_touch.py is the one to use: picamera2 runs a low-resolution preview stream and a high-resolution capture stream at the same time, so pressing the shutter never freezes the viewfinder. It saves 1920×1080 at JPEG quality 48 and then makes it worse on purpose: grain, chromatic aberration, downscale artifacts. digicam.py switches configurations on capture instead and saves clean 2304×1296 at quality 95, for when the retro look isn’t the point.

gallery.py watches the photo directories with watchdog and pushes each new file to connected browsers over SSE, with no polling and no refresh. It takes --port, --dirs and --host so it can watch both capture folders at once.

← All projects