CCTV Camera Database
+This database now lives at cctv-database.com.
+Redirecting… if nothing happens, click here.
+ +diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 41222d9a..ed4042eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,6 +13,8 @@ jobs: - uses: actions/setup-node@v4 with: node-version: "20" + - name: Install dependencies + run: npm ci - name: Build & validate dataset run: node scripts/build.js - name: Generate docs @@ -41,6 +43,8 @@ jobs: - uses: actions/setup-node@v4 with: node-version: "20" + - name: Install dependencies + run: npm ci - name: Build dataset run: node scripts/build.js - name: Copy data into docs for Pages diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e7e9a39..b7cd557d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,6 +19,9 @@ jobs: with: node-version: "20" + - name: Install dependencies + run: npm ci + - name: Determine version id: version run: | diff --git a/.gitignore b/.gitignore index 57ad539c..37166412 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ *.log .DS_Store .idea/ +.env diff --git a/CHANGELOG.md b/CHANGELOG.md index d40b8b60..e2a781db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,27 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) --- +## [1.6.0] — 2026-06-17 + +### Added + +- **Schema validation now enforced in the build** — every entry is validated against `schema/camera.schema.json` via Ajv. Previously the build only hand-checked five required fields, so the schema had silently drifted from the data; it is now the single source of truth and CI fails on any violation. +- **11 fields added to the schema** that the data already used but never declared: localized prices `msrp_eur`, `msrp_gbp`, `msrp_inr`, `msrp_aed`, `msrp_aud`, `msrp_cad`, `msrp_vnd`, `msrp_chf`; plus `markets`, `generation`, and `release_notes`. +- **`storage.notes`** field — free-text storage notes (e.g. external-hub requirements). +- **`hdcvi` and `mxpeg`** added to the `protocols` enum (HD-CVI coax for HiLook/Dahua analog; MxPEG for Mobotix). +- **Reolink Video Doorbell PoE** enriched — verified Frigate config (tested by blakeblacksear on v0.14, go2rtc), Home Assistant details (`local_push`, doorbell button, two-way audio, ONVIF events), plus `soc` (Novatek NT98566), `poe_class`, and outdoor `environment`. + +### Fixed + +- Removed invalid `ip_rating: null` from 3 indoor cameras (Amcrest ASH42-W, Tapo C121, Tapo C135) — the field is optional and `null` is not a valid rating. + +### Changed + +- Dataset mirroring to a downstream consumer is now opt-in via the `DATA_MIRROR_DIR` env var (configurable through a local, gitignored `.env`), replacing a hardcoded copy path in the build script. +- **Project now points to the website at [cctv-database.com](https://cctv-database.com)** — README links and `package.json` `homepage` updated. The GitHub Pages demo redirects there, with a standalone offline copy kept at `docs/demo.html`. The README now states explicitly that the dataset is CC0 and always will be. + +--- + ## [1.5.0] — 2026-06-12 ### Added diff --git a/README.md b/README.md index ae101f12..445aa164 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,15 @@ An open, structured database of 1,314 CCTV / IP camera models and their technica Camera spec sheets are scattered across vendor PDFs, retailer pages, and paywalled databases (IPVM, etc.) in inconsistent formats. This repo normalises them into one machine-readable structure so they can be compared, filtered, and reused. +**The dataset is CC0 and always will be** — free to use, copy, and redistribute with no restrictions. The website is just a convenient viewer; the data here is the source of truth. + --- ## Browse online -**[Live Demo ](https://ch-bas.github.io/cctv-camera-databse)** +**[Browse the database → cctv-database.com](https://cctv-database.com)** + +Prefer to self-host or browse offline? A [standalone demo](docs/demo.html) (just `demo.html` + `cameras.json`, no build step) is included — serve the `docs/` folder locally with any static server, e.g. `python3 -m http.server` inside `docs/`, then open it.
diff --git a/cameras/amcrest/ash42-w.json b/cameras/amcrest/ash42-w.json
index 29ea0d04..c2836452 100644
--- a/cameras/amcrest/ash42-w.json
+++ b/cameras/amcrest/ash42-w.json
@@ -29,7 +29,6 @@
"protocols": [
"rtsp"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
diff --git a/cameras/reolink/video-doorbell-poe.json b/cameras/reolink/video-doorbell-poe.json
index 5d52e6e8..abe07d46 100644
--- a/cameras/reolink/video-doorbell-poe.json
+++ b/cameras/reolink/video-doorbell-poe.json
@@ -24,7 +24,8 @@
"range_m": 5
},
"power": {
- "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC"
+ "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC",
+ "poe_class": 2
},
"storage": {
"onboard": true,
@@ -52,6 +53,10 @@
"works with Reolink NVR"
],
"release_year": 2022,
+ "environment": [
+ "outdoor"
+ ],
+ "soc": "Novatek NT98566",
"sources": [
"https://reolink.com/product/reolink-video-doorbell-poe/"
],
@@ -88,11 +93,19 @@
},
"rtsp_url_template": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main",
"best_substream": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_sub",
- "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT."
+ "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT.",
+ "verified": true,
+ "tested_by": "blakeblacksear",
+ "tested_version": "0.14",
+ "recommended_stream_type": "go2rtc"
},
"home_assistant": {
"integration": "reolink",
- "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel."
+ "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel.",
+ "connection_type": "local_push",
+ "doorbell_button": true,
+ "two_way_audio": true,
+ "onvif_events": true
},
"blue_iris": {
"profile": "Reolink",
diff --git a/cameras/tapo/c121.json b/cameras/tapo/c121.json
index b16c3dd5..6c694666 100644
--- a/cameras/tapo/c121.json
+++ b/cameras/tapo/c121.json
@@ -35,7 +35,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
diff --git a/cameras/tapo/c135.json b/cameras/tapo/c135.json
index d21bfae0..eca11693 100644
--- a/cameras/tapo/c135.json
+++ b/cameras/tapo/c135.json
@@ -35,7 +35,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
diff --git a/data/cameras.json b/data/cameras.json
index 15b3ab8a..e8593d56 100644
--- a/data/cameras.json
+++ b/data/cameras.json
@@ -2679,7 +2679,6 @@
"protocols": [
"rtsp"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
@@ -80367,7 +80366,8 @@
"range_m": 5
},
"power": {
- "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC"
+ "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC",
+ "poe_class": 2
},
"storage": {
"onboard": true,
@@ -80395,6 +80395,10 @@
"works with Reolink NVR"
],
"release_year": 2022,
+ "environment": [
+ "outdoor"
+ ],
+ "soc": "Novatek NT98566",
"sources": [
"https://reolink.com/product/reolink-video-doorbell-poe/"
],
@@ -80431,11 +80435,19 @@
},
"rtsp_url_template": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main",
"best_substream": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_sub",
- "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT."
+ "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT.",
+ "verified": true,
+ "tested_by": "blakeblacksear",
+ "tested_version": "0.14",
+ "recommended_stream_type": "go2rtc"
},
"home_assistant": {
"integration": "reolink",
- "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel."
+ "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel.",
+ "connection_type": "local_push",
+ "doorbell_button": true,
+ "two_way_audio": true,
+ "onvif_events": true
},
"blue_iris": {
"profile": "Reolink",
@@ -87615,7 +87627,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
@@ -87775,7 +87786,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
diff --git a/docs/cameras.json b/docs/cameras.json
index 15b3ab8a..e8593d56 100644
--- a/docs/cameras.json
+++ b/docs/cameras.json
@@ -2679,7 +2679,6 @@
"protocols": [
"rtsp"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
@@ -80367,7 +80366,8 @@
"range_m": 5
},
"power": {
- "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC"
+ "method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC",
+ "poe_class": 2
},
"storage": {
"onboard": true,
@@ -80395,6 +80395,10 @@
"works with Reolink NVR"
],
"release_year": 2022,
+ "environment": [
+ "outdoor"
+ ],
+ "soc": "Novatek NT98566",
"sources": [
"https://reolink.com/product/reolink-video-doorbell-poe/"
],
@@ -80431,11 +80435,19 @@
},
"rtsp_url_template": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main",
"best_substream": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_sub",
- "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT."
+ "notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT.",
+ "verified": true,
+ "tested_by": "blakeblacksear",
+ "tested_version": "0.14",
+ "recommended_stream_type": "go2rtc"
},
"home_assistant": {
"integration": "reolink",
- "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel."
+ "notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel.",
+ "connection_type": "local_push",
+ "doorbell_button": true,
+ "two_way_audio": true,
+ "onvif_events": true
},
"blue_iris": {
"profile": "Reolink",
@@ -87615,7 +87627,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
@@ -87775,7 +87786,6 @@
"rtsp",
"onvif"
],
- "ip_rating": null,
"audio": {
"microphone": true,
"speaker": true,
diff --git a/docs/demo.html b/docs/demo.html
new file mode 100644
index 00000000..7ced77d8
--- /dev/null
+++ b/docs/demo.html
@@ -0,0 +1,1337 @@
+
+
+
Open dataset of IP camera specifications. Search, filter, and compare — no account needed.
+Open dataset of IP camera specifications. Search, filter, and compare — no account needed.
-This database now lives at cctv-database.com.
+Redirecting… if nothing happens, click here.
+ +