WaveBack is an open-source, touchless feedback kiosk for restaurants and retail counters. It uses an ESP32-WROVER camera over USB serial, a local Python camera bridge, and a FastAPI backend with MediaPipe gesture detection to record customer feedback from smiles, thumbs up, and thumbs down.
The customer-facing kiosk runs locally at http://127.0.0.1:8002/kiosk and displays a large live camera preview with the prompt:
Express your Experience
Smile, 👍 or 👎 to share your feedback
- ESP32-WROVER camera capture over USB serial.
- Local camera bridge exposing JPEG frames over HTTP.
- FastAPI backend for detection, stats, dashboard, and kiosk UI.
- MediaPipe hand detection for thumbs up and thumbs down.
- MediaPipe face mesh heuristics for smile and negative expression detection.
- Polished kiosk screen with positive thank-you flow and negative coupon flow.
- Real SVG QR code generation for the demo coupon.
- Optional I2C 1602 LCD firmware support.
backend/ FastAPI backend and kiosk/dashboard frontend
camera_serial_localhost/ ESP32 serial camera firmware and local bridge
camera_web_ap/ Alternative ESP32 camera web AP firmware
firmware/ Reference ESP32 firmware binary
*.md Product and implementation docs
Create and activate a Python virtual environment, then install the backend dependencies:
python3 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements.txtStart the ESP32 USB camera bridge:
cd camera_serial_localhost
../.venv/bin/python tools/local_camera_server.pyIn another terminal, start the backend:
cd backend
../.venv/bin/python -m uvicorn app:app --host 127.0.0.1 --port 8002 --reloadOpen:
- Kiosk:
http://127.0.0.1:8002/kiosk - Dashboard:
http://127.0.0.1:8002/dashboard - Health check:
http://127.0.0.1:8002/health
The active USB serial camera firmware lives in camera_serial_localhost/src/main.cpp and is built with PlatformIO.
cd camera_serial_localhost
pio run
pio run --target uploadThe firmware is Arduino C++ for ESP32, not MicroPython.
WaveBack is released under the MIT License. See LICENSE.