# video-surveillance-portal — Session Handoff **Last Session:** 2026-05-12_162235_video-surveillance-portal **Model:** deepseek-v4-pro **Status:** in-progress **Updated:** 2026-05-12T16:22:35.809084 ## Summary Video surveillance portal: 4 Docker containers. ONVIF event polling, multi-channel alerts, ANPR via PlateRecognizer API, phone camera via WebRTC WHIP, live view grid, PTZ control, HTTPS for mobile. ## Key Decisions - Skip local AI (Celeron N4000 too weak) - ONVIF PullPoint for events - PlateRecognizer Cloud API - Phone via WebRTC WHIP - HTTPS self-signed cert - SQLite instead of PostgreSQL - MediaMTX host network ## Pending Tasks - [ ] Test with real ICSee ONVIF camera - [ ] Configure Twilio/SMTP/Telegram - [ ] Configure PlateRecognizer token - [ ] Test phone from Samsung S22 ## Files Touched - `docker-compose.yml` - `Dockerfile` - `requirements.txt` - `Makefile` - `config/nginx.conf` - `config/mediamtx.yml` - `src/main.py` - `src/config.py` - `src/api/cameras.py` - `src/api/alerts.py` - `src/api/plates.py` - `src/api/streams.py` - `src/onvif_client/events.py` - `src/onvif_client/ptz.py` - `src/onvif_client/snapshot.py` - `src/alerts/dispatcher.py` - `src/alerts/emailer.py` - `src/alerts/sms.py` - `src/alerts/telegram.py` - `src/anpr/plate_client.py` - `src/recording/recorder.py` - `src/db/database.py` - `src/db/models.py` - `frontend/index.html` ## Docker ```json { "containers": [ "vsp-nginx", "vsp-app", "vsp-redis", "vsp-mediamtx" ], "ports": { "http": 8081, "https": 8444 } } ``` --- *Auto-generated from session `2026-05-12_162235_video-surveillance-portal`. Run `python3 .codex/save-session.py --handoff video-surveillance-portal` to regenerate.*