Installation
realtime-calib runs entirely on your own hardware. The complete application is run with Docker Compose — that is the one supported way to bring up the full stack.
Prerequisites
- One or more USB cameras.
- Docker and Docker Compose v2.
- mkcert and openssl — to issue the local TLS certificate the stack needs. WebRTC requires a secure context, and LAN devices (e.g. a tablet) must trust the certificate.
- A modern browser on the operator device (desktop, tablet or mobile).
One-time setup
# 1. Environment file
cp .env.example .env
# Edit .env: set HOST_IP to the machine's LAN IP (e.g. 192.168.1.42) and choose
# dedicated LiveKit API keys.
# 2. Trust the mkcert local CA (once per machine)
mkcert -install
# 3. Generate the LAN certificate (covers HOST_IP + localhost)
./caddy/generate-certs.sh
# -> writes caddy/certs/livekit.crt and caddy/certs/livekit.key (gitignored)
The host IP is centralized in HOST_IP (in .env) and propagated to Caddy,
LiveKit and the web app build. Do not hard-code IPs elsewhere.
Launch
The whole stack — calibration service, web app, LiveKit SFU, token server and the
Caddy reverse proxy (TLS) — is orchestrated by docker-compose.yml as a single
stack. Caddy is the mandatory, always-on entry point.
docker compose up --build
Then open the web app:
- Tablet / other LAN device:
https://<HOST_IP> - Same machine:
https://localhost
One mkcert certificate covers both.
Verifying the install
docker compose logs -f calibration-service
Open https://<HOST_IP> (or https://localhost) and you should land on the
operator Dashboard ("Welcome to the calibration bench").
Networking notes
- Caddy is the only host-exposed entry point, serving HTTPS on
443(override withCADDY_HTTPS_PORT). Everything else sits on an internal Docker bridge. - Internal services are not published on the host:
calibration-service(8000) andlivekit-token-server(8080) are reachable only through Caddy. - LiveKit runs on the bridge (not host networking). Its media ports are
published to the host and advertised at
HOST_IP: UDP50000-50010(WebRTC media) and TCP7881(ICE-TCP fallback). Signaling (7880) stays internal — Caddy proxies it aswss. - TLS certificates live in
caddy/certs/(git-ignored); one mkcert certificate coversHOST_IPandlocalhost.
Continue to the Quickstart to run your first calibration.