Task app with live webcam stream, multi-user login, and realtime updates via WebSocket. Runs on a Raspberry Pi in the local network.
- Live webcam stream in the browser
- Login with name + optional PIN (auto-registration)
- Create and complete tasks
- Live updates on all devices via WebSocket
- Runs via Docker in one command
- Optional task video recording (saved on the Pi)
- Warm-up countdown before tasks start
- No-repeat cooldown for attendee draws
- Raspberry Pi OS (64-bit recommended)
- Docker and Docker Compose installed
- USB webcam or official Pi camera
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Log out and back in or rebootsudo raspi-config
# -> Interface Options -> Camera -> Enable
sudo rebootIf you use a USB webcam, this step is not required.
From your laptop:
scp -r ~/Documents/private_workspace/pi-webapp pi@<pi-ip>:~/pi-webappReplace <pi-ip> with your Pi's IP address (e.g. 192.168.1.50).
Plug in the USB webcam and verify:
ls /dev/video0If the file exists, the camera is detected.
cd ~/pi-webapp
docker compose up -dThe first build takes a few minutes.
From any device on the same network:
http://<pi-ip>
# View logs
docker compose logs -f
# Stop the app
docker compose down
# Rebuild (after code changes)
docker compose up -d --buildWhen a task starts, recording begins; when it ends, recording stops.
Videos are saved on the Pi under recordings/ with timestamps, names, and task text in the filename.
Recording can be enabled/disabled in the Admin page and the setting persists across restarts.
When a task starts, the kisscam shows a 3-2-1 countdown before the task overlay appears. You can set how many rounds an attendee is excluded from re-draw in the Admin page.
On your laptop for testing:
Terminal 1 — Webcam stream:
cd pi-webapp
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install opencv-python
python scripts/webcam_stream.pyTerminal 2 — Web app:
cd pi-webapp
source .venv/bin/activate
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadThen open: http://localhost:8000
| Service | Port | Description |
|---|---|---|
| web | 8000 | FastAPI app (Jinja2 + HTMX) |
| stream | 8081 | MJPEG webcam stream |
| caddy | 80 | Reverse proxy (bundles everything) |