# Video Surveillance Portal — AGENTS.md ## Project Web portal for video surveillance. IP cameras, smart devices, person detection alerts via email/SMS. ## Stack (confirmed) - Backend: Python 3.12 + FastAPI - Stream relay: MediaMTX (RTSP → WebRTC/HLS) - Detection: Camera built-in human detection (ONVIF events) — NO local AI on Celeron N4000 - Message broker: Redis pub/sub - Database: SQLite (128GB SSD, single-user) - Frontend: Vanilla HTML/CSS/JS (single page, no framework) - Deployment: Docker Compose (4 containers: nginx, app, redis, mediamtx) - Notifications: SMTP (email), Twilio (SMS), Telegram - ANPR: PlateRecognizer Cloud API (free tier, 2500 calls/month) ## Directory Structure ``` src/ api/ FastAPI routes detection/ Person detection engine streams/ Camera stream management alerts/ Alert dispatch (email, sms, webhook) devices/ Smart device integration storage/ Recording management config/ App configuration tests/ config/ Nginx, docker, default configs scripts/ Dev helpers ``` ## Commands ``` python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt docker compose up -d make fmt # ruff format make lint # ruff check + mypy make test # pytest -q ``` ## Conventions - Black formatting, 88 chars - snake_case files, CapWords classes - Type hints everywhere - pytest tests mirroring src/ structure - Conventional Commits ## Key Design Goals - Person detection → alert latency under 5 seconds (camera does detection) - ONVIF PullPoint for event capture (fallback: FTP watchdog) - RTSP stream relay with WebRTC for low-latency browser viewing - Alert cooldown per camera to prevent spam - Phone camera ingest via WebRTC WHIP (no native app) - HTTPS required for mobile browser getUserMedia ## Running ``` docker compose up -d # http://localhost:8081 + https://10.0.50.210:8444 docker compose down make lint make test ``` ## Handoff - See `HANDOFF.md` for latest session state and pending tasks - Sessions: `.sessions/latest.json` + global `.codex/sessions/`