Raspberry Pi photo kiosk for kids. Plug in camera, view photos on TV with fun filters, navigate with Xbox controller.
- Photo slideshow with smooth animated transitions
- Xbox controller navigation - every button does something!
- Stickers - add, move, resize, and cycle through emoji stickers
- Decorative frames - Polaroid, Rainbow, Filmstrip, Sparkle, and more
- Sound effects for all interactions
- Auto camera detection - plug in camera, photos import automatically
- Import progress with confetti celebration when complete
- Raspberry Pi 4 (4GB recommended)
- Xbox controller (Bluetooth)
- USB camera (must be USB mass storage, NOT MTP)
- Powered USB hub recommended - cameras draw too much power from Pi directly
- TV/monitor via HDMI (1920x1080)
On a fresh Raspberry Pi OS, first install git:
sudo apt update && sudo apt install -y git# Clone the repo
git clone https://github.com/hald/photostation.git
cd photostation
# Run the installer
./install.sh
# Reboot
sudo rebootAfter reboot, the kiosk starts automatically. Plug in a camera and photos import automatically!
# Check all services are running
sudo systemctl status photostation-backend photostation-frontend photostation-kiosk
# Test backend API
curl http://localhost:8000/api/status| Component | Technologies |
|---|---|
| Frontend | React, TypeScript, Vite, framer-motion, Howler.js |
| Backend | Python, FastAPI, uvicorn, Pillow |
| Display | Chromium kiosk mode, systemd services |
For contributors developing on Mac/Linux:
# Backend (Terminal 1)
cd backend && python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload --port 8000
# Frontend (Terminal 2)
cd frontend && npm install && npm run devOpen http://localhost:5173 in your browser.
To deploy changes to a Pi: ./deploy.sh (see script comments for config).
| Button | Action |
|---|---|
| D-pad Left/Right | Previous/next photo |
| D-pad Up/Down | Cycle frames |
| A | Drop sticker |
| B | Remove sticker |
| X | Add sticker / cycle emoji |
| Y | Silly sound |
| LB/RB | Cycle through stickers |
| Left stick | Move sticker |
| Right stick | Resize sticker |
| Start | Play/pause slideshow |
photostation/
├── frontend/ # React + Vite app
├── backend/ # Python FastAPI server
├── deploy.sh # Deploy to Pi
├── start-all.sh # Start all services locally
├── start-kiosk.sh # Launch Chromium kiosk
└── mount-camera.sh # Mount camera and import photos
journalctl -u photostation-backend -n 50
journalctl -u photostation-frontend -n 50
journalctl -u photostation-kiosk -n 50- Check if camera is mounted:
mount | grep camera - Check import log:
journalctl -u photostation-import -n 20 - Manual mount:
sudo mount /dev/sda1 /media/camera - Manual import:
curl -X POST http://localhost:8000/api/import
See xbox-controller-setup.md for Bluetooth pairing instructions.
- Check kiosk service:
sudo systemctl status photostation-kiosk - Restart X:
sudo systemctl restart photostation-kiosk
The kiosk runs fullscreen, but you can still reach a terminal:
- SSH:
ssh pi@<pi-ip-address>from another computer - Switch TTY: Press
Ctrl+Alt+F1to get a login prompt (keyboard required) - Return to kiosk: Press
Ctrl+Alt+F7or reboot
To temporarily stop the kiosk: sudo systemctl stop photostation-kiosk
Sound effects obtained from ZapSplat
MIT