BLA
BLA (Blind LLM Agents) is the open-source Blue Defense MCP and CLI built to protect software artifacts against automated AI reverse-engineering workflows.
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Self-hosted NVR for IP cameras with local AI: continuous recording, go2rtc streaming, YOLO11 detection, faces, re-ID, VLM descriptions. Hikvision first, ONVIF second. One Docker stack, one install command. AGPL-3.0.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A self-hosted NVR for IP cameras (Hikvision first, ONVIF second) that records everything locally, runs its own AI on your GPU and never talks to a cloud. One Docker stack, one install command.
Website: openvigil.dev · Română: README.ro.md · manual detaliat: docs/ro/manual.md
Status. Built for one real installation (18 Hikvision cameras, an NVIDIA RTX 2000 Ada, running 24/7 since mid-2026) and published as is, under AGPL-3.0. The interface is in English and Romanian; the code and its comments are in Romanian. It is a working system, not a product: expect rough edges outside the hardware it was built on, and read NOTICE.md for the licences of the models it downloads.
Taken on the built-in demo mode (synthetic cameras), so no real footage.
| Live | Playback with timeline |
|---|---|
| HD view | Settings → Status |
|---|---|
/verifica page to verify an exported clip by hash.data/ is plain files and SQLite you can read without the app./acasa, /plecat, /noapte, /stare), an automation API
with its own token (/api/v1) for Node-RED or Home Assistant, forward-auth for other tools
behind the same login, a camera clock check, a speed test that picks the playback
resolution, stream quality per Hikvision camera, privacy masks,
an archive tier that recompresses old recordings, coverage and continuity charts, and an
installable PWA for the phone.data/ is plain files and SQLite, so you
are never locked in.cameras (RTSP/ISAPI/ONVIF)
│
▼
┌─────────┐ rtsp://127.0.0.1:8554/camN_main ┌──────────┐
│ go2rtc │ ─────────────────────────────────▶ │ record │ ─▶ data/recordings/camN/*.mp4
│ (host) │ └──────────┘
└────┬────┘ /api/ws (relay :STREAM_PORT) ┌──────────┐
└────────────────────────────────────────▶│ web │ ◀── browser (:WEB_PORT)
│ Flask │ ─▶ data/*.db, settings.json
└────┬─────┘
│ /detect, /faces, /describe (localhost)
┌────▼─────┐
│ ai │ YOLO11 · InsightFace · OSNet
│ (GPU) │ Qwen2.5-VL · SigLIP
└──────────┘
All four containers share one image and the host network. Only WEB_PORT (UI) and
8555/udp+tcp (WebRTC media) are meant to be reachable from the LAN.
install.sh installs them on Ubuntu
(22.04 or newer); on Debian and other distributions install Docker Engine with the Compose
plugin from Docker's own repository first, then run the script.install.sh installs nvidia-container-toolkit when it finds nvidia-smi.
Without a GPU you get libx264 transcoding and CPU detection; faces, re-ID, descriptions and
semantic search still run on the CPU but far too slowly to be useful, so turn them off.git clone https://github.com/sm26449/openvigil.git /opt/openvigil
cd /opt/openvigil
sudo ./install.sh
The script explains each step: Docker, GPU toolkit, .env (time zone, ports, data
directory, the uid that owns the files), then pulls the published image
(ghcr.io/sm26449/openvigil, about 11 GB: PyTorch with CUDA is most of it) and starts the
stack. sudo ./install.sh --build builds the image locally from the checkout instead
(~20 minutes, ~6 GB of wheels); that is also what happens automatically when PUID/PGID
are not 1000, because the published image runs as 1000:1000. When the UI answers, open http://<server-ip>:8079, create the first
account on /setup, then add cameras from Cameras → Add camera (there is a LAN
scanner).
Everything you may want to change by hand is in .env (see .env.example). Everything
else is set from the UI and lives in data/settings.json.
Day-to-day:
docker compose logs -f web # add -f docker-compose.gpu.yml on GPU hosts
sudo ./install.sh --update # git pull, pull the new image (or rebuild), restart
docker compose run --rm --no-deps web test # pytest (350+ tests)
The interface is available in English and Romanian. It follows the browser's language
by default; every account can pin its own in My account → Language, and the login page has
a switch (?lang=en). NVR_LANG in .env sets the server default, which is also the
language of Telegram and e-mail notifications and of the daily digest.
Adding or adjusting a language needs no code: Romanian is the source text, so a dictionary
is a flat JSON file mapping Romanian strings to translations. Drop
data/i18n/<code>.json next to your recordings to override any string or add a language
({"_meta": {"nume": "Deutsch"}, "Adaugă camera": "Kamera hinzufügen", ...});
app/static/i18n/en.json is the complete reference and python3 scripts/i18n_check.py
reports missing keys. Contributions of new languages are welcome.
No cameras yet? Settings → Tools → Demo mode adds four synthetic cameras (go2rtc generates the picture with ffmpeg's test sources). They stream, record and play back like real ones, so you can explore the interface, test an install, or take screenshots that show nobody's house. Remove them from the same card when you are done.
Keep the UI off the public internet; put it behind Traefik, Caddy or nginx with TLS and
set in .env:
HTTPS=true
TRUSTED_PROXIES=127.0.0.0/8,::1/128,172.18.0.0/16 # loopback + the proxy's Docker subnet
TRUSTED_PROXIES must list only the addresses the proxy connects from: X-Forwarded-For
and X-Forwarded-Proto are believed from those addresses alone (they drive the login rate
limit, the audit log and the Secure cookie). The containers use the host network, so a LAN
range here would let any LAN host spoof them.
The proxy must forward /api/ws and /api/frame.jpeg to STREAM_PORT (the video relay)
and everything else to WEB_PORT. /api/auth/forward is a forward-auth endpoint if you
want other internal tools behind the same login.
data/
recordings/camN/YYYY-MM-DD/HH-MM-SSZ.mp4 segments (UTC names)
events.db, segmente.db, settings.json journal, chain of custody, settings
cameras.json, users.json, go2rtc.yaml cameras (with passwords, mode 600), accounts
faces/, plates/, reid/, dataset/, finetune/ AI data and training material
backup/ nightly Fernet-encrypted backups (key in data/backup_key)
models/ Hugging Face cache (Qwen, SigLIP)
data/ is a bind mount: back it up, and if you want encryption at rest put it on a LUKS
or fscrypt volume on the host. The app only notices when the directory is not writable.
docker system df).hwaccel GPU (h264_nvenc): NU in the web log, or torch cuda: False: the containers
don't see the GPU. Check nvidia-smi on the host, then docker info | grep -i runtimes
must list nvidia; rerun sudo ./install.sh to install the toolkit, and make sure you start
the stack with -f docker-compose.gpu.yml.DATA_DIR on the
host is not writable by PUID:PGID from .env (chown), or the volume is read-only.WEB_PORT, STREAM_PORT, AI_PORT, WEBRTC_PORT or the
go2rtc addresses in .env, then docker compose up -d.docker compose logs go2rtc shows the
dial error. Hikvision cameras also need ISAPI enabled for events, siren and talk.docker compose logs -f web record ai go2rtc; passwords never appear in them.Day-to-day operations (logs, updates, backups, ports, uninstall): docs/operare.md (Romanian).
tests/test_*.py: unit and API tests. Run inside the image with docker compose run --rm --no-deps web test,
or on a plain machine with pip install -r requirements-ci.txt && python -m pytest -q tests
(the AI-dependent tests skip themselves). This is what CI runs on every push.tests/ui-test.js: a Playwright walk through the real UI (needs a running stack and
NVR_TEST_USER / NVR_TEST_PASS for an admin account of a test installation).scripts/module_check.py: static check of the ES modules.AGPL-3.0, see LICENSE. Third-party components and model licences are listed in NOTICE.md. Two of the models it downloads are licensed for non-commercial use only: the InsightFace face models and Qwen2.5-VL-3B (descriptions). A commercial deployment has to disable faces and descriptions or obtain licences from their authors. Not affiliated with Hikvision, NVIDIA or ONVIF.
Legal notice. OpenVigil can perform face recognition, person re-identification and licence-plate reading. These features process personal and, for faces, biometric data. You are solely responsible for using them lawfully on your own premises under the laws that apply to you: for example the GDPR in the EU (biometric data, lawful basis, data-subject rights), national video-surveillance rules and the obligation to signpost monitored areas. The software is provided "as is", without warranty of any kind and without liability for damages, as stated in sections 15 and 16 of the AGPL-3.0.
OpenVigil was built by Stefan Maldaianu (@sm26449), who designed it around his own installation and runs it every day, together with Claude (Anthropic's Claude Fable 5.1), which wrote most of the code in pair-programming sessions that Stefan directed, tested on real hardware and reviewed. Contact: [email protected].