diff --git a/CLAUDE.md b/CLAUDE.md
index 783224b8..7980e5e8 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -54,9 +54,10 @@ No Go on the host; Node 24 for the frontend.
`/web-interface` from a real camera. Needs Docker and network access to the
camera; everything else is in the image it builds. Run it when the WebUI
changes shape (every few months). It redacts the camera's identity,
- substitutes a scene over the live player, refuses to open the CGIs that reset
- or reboot on render, and fails the run rather than installing if anything
- identifying survives. `tools/webui-gallery/README.md` has the traps.
+ substitutes a scene over every picture from the camera, refuses to open the
+ CGIs that reset or reboot on render, and fails the run rather than installing
+ if anything identifying survives. Look at every capture anyway: the checks
+ read text and DOM, never pixels. `tools/webui-gallery/README.md` has the traps.
## Deploying
diff --git a/data/locales/pages.en.yml b/data/locales/pages.en.yml
index 322e5b28..ed3009cf 100644
--- a/data/locales/pages.en.yml
+++ b/data/locales/pages.en.yml
@@ -846,8 +846,14 @@ en:
step3_title: 'Keep'
title: 'Video encoding'
web_interface:
- intro: 'Every OpenIPC camera serves this interface itself, over its own address — there is no cloud account and no app in between. These are the pages of a camera running a current build.'
- scene_credit_html: 'The beach in the Camera Preview and Majestic Settings shots is the view from a camera belonging to @usa-, an OpenIPC user, published with permission.'
+ detection_title: 'Person detection and tracking'
+ detection_tracking_html: 'Detections arrive a few times a second, not with every frame, and the video shows what makes that enough: a tracker that keeps each person''s number through the gaps. Here it runs on detections made from the recording at that rate; it is a prototype, not yet in the firmware.'
+ detection_video_caption: 'White flash: a detection arriving, about 2.5 a second. Coloured box and number: the same person, carried between detections. Faces pixelated.'
+ detection_video_label: 'Tracking people between detections, on a recorded street scene'
+ detection_what_html: 'Object detection (objectDetect in the settings) reports people in the picture. Every box goes where motion already goes: drawn over the picture in the browser, into the ONVIF metadata track and the track inside a recording, to pan/tilt following, and out of /api/v1/analytics.'
+ detection_where_html: 'On the GK7205V500, V510 and V530 it is YOLOv8 on the neural accelerator, with the models in the firmware, and it tells people from vehicles and animals (more).'
+ intro: 'Every OpenIPC camera serves this interface itself, over its own address — there is no cloud account and no app in between. These are the pages of a camera running a current build: the live picture, recordings played back from the memory card, detection drawn over the picture, and the settings behind them.'
+ scene_credit_html: 'The beach on the Dashboard, Live, Recordings and Camera - Settings shots is the view from a camera belonging to @usa-, an OpenIPC user, published with permission. The Motion detection shot is staged: the street is a frame of the recording in the video below, with faces pixelated, and its three boxes were handed to the interface''s own overlay, because the lab camera''s build carries no person detector.'
title: Web Interface
# The one-question strip on / and /get-started (#185). REMOVE AFTER 2027-01.
why:
diff --git a/data/locales/pages.ru.yml b/data/locales/pages.ru.yml
index 116e6140..69ff68d6 100644
--- a/data/locales/pages.ru.yml
+++ b/data/locales/pages.ru.yml
@@ -884,8 +884,14 @@ ru:
step3_title: 'Сопровождение'
title: 'Видеокодирование'
web_interface:
- intro: 'Каждая камера с OpenIPC отдаёт этот интерфейс сама, по собственному адресу: ни облачного аккаунта, ни приложения-посредника. Ниже — страницы камеры с актуальной сборкой.'
- scene_credit_html: 'Пляж на снимках Camera Preview и Majestic Settings — это вид с камеры пользователя OpenIPC @usa-, опубликован с разрешения владельца.'
+ detection_title: 'Детекция и сопровождение людей'
+ detection_tracking_html: 'Детекции приходят несколько раз в секунду, а не с каждым кадром, и видео показывает, почему этого хватает: трекер сохраняет за каждым человеком его номер в промежутках между детекциями. Здесь он работает на детекциях, сделанных по записи с той же частотой; это прототип, в прошивке его пока нет.'
+ detection_video_caption: 'Белая вспышка — пришла детекция, примерно 2,5 раза в секунду. Цветная рамка с номером — тот же человек между детекциями. Лица размыты.'
+ detection_video_label: 'Сопровождение людей между детекциями на записи улицы'
+ detection_what_html: 'Детекция объектов (objectDetect в настройках) сообщает о людях в кадре. Каждая рамка идёт туда же, куда и движение: поверх картинки в браузере, в дорожку метаданных ONVIF и в дорожку внутри записи, в слежение поворотной камеры и в /api/v1/analytics.'
+ detection_where_html: 'На GK7205V500, V510 и V530 это YOLOv8 на нейроускорителе, модели уже лежат в прошивке, и он отличает людей от транспорта и животных (подробнее).'
+ intro: 'Каждая камера с OpenIPC отдаёт этот интерфейс сама, по собственному адресу: ни облачного аккаунта, ни приложения-посредника. Ниже — страницы камеры с актуальной сборкой: живая картинка, записи с карты памяти, детекция поверх изображения и настройки за всем этим.'
+ scene_credit_html: 'Пляж на снимках Dashboard, Live, Recordings и Camera - Settings — это вид с камеры пользователя OpenIPC @usa-, опубликован с разрешения владельца. Снимок Motion detection постановочный: улица — кадр из записи в видео ниже, лица размыты, а три рамки переданы собственному оверлею интерфейса, потому что в сборке лабораторной камеры нет детектора людей.'
title: Веб интерфейс
why:
close: "Закрыть"
diff --git a/data/locales/pages.zh.yml b/data/locales/pages.zh.yml
index 1eb28f5a..6df4a45f 100644
--- a/data/locales/pages.zh.yml
+++ b/data/locales/pages.zh.yml
@@ -846,8 +846,14 @@ zh:
step3_title: '维护'
title: '视频编码'
web_interface:
- intro: '每台运行 OpenIPC 的摄像机都由自身提供这个界面,通过它自己的地址访问:无需云端账户,也不需要任何中间应用。以下是一台运行当前版本固件的摄像机的页面。'
- scene_credit_html: '“Camera Preview”和“Majestic Settings”截图中的海滩,来自 OpenIPC 用户 @usa- 的摄像机画面,已获授权发布。'
+ detection_title: '人形检测与跟踪'
+ detection_tracking_html: '检测结果每秒到达几次,而不是每一帧都有,视频展示了为什么这已经足够:跟踪器在两次检测之间为每个人保留其编号。这里它运行在以同样频率从录像中得到的检测结果上;它还是一个原型,尚未进入固件。'
+ detection_video_caption: '白色闪烁:一次检测到达,约每秒 2.5 次。彩色框和编号:两次检测之间保持不变的同一个人。人脸已打码。'
+ detection_video_label: '在一段街道录像上,于两次检测之间跟踪行人'
+ detection_what_html: '目标检测(设置中的 objectDetect)报告画面中的人。每个框都会送到运动检测结果已经送达的地方:浏览器中叠加在画面上、ONVIF 元数据轨道和录像内的轨道、云台跟随,以及 /api/v1/analytics。'
+ detection_where_html: '在 GK7205V500、V510 和 V530 上,它是神经网络加速器上的 YOLOv8,模型已内置在固件中,并能区分人、车辆和动物(详情)。'
+ intro: '每台运行 OpenIPC 的摄像机都由自身提供这个界面,通过它自己的地址访问:无需云端账户,也不需要任何中间应用。以下是一台运行当前版本固件的摄像机的页面:实时画面、从存储卡回放的录像、叠加在画面上的检测框,以及它们背后的设置。'
+ scene_credit_html: 'Dashboard、Live、Recordings 和 Camera - Settings 截图中的海滩,来自 OpenIPC 用户 @usa- 的摄像机画面,已获授权发布。Motion detection 截图是摆拍的:街道是下方视频中录像的一帧,人脸已打码,三个框交由界面自身的叠加层绘制,因为实验室摄像机的固件版本不带人形检测器。'
title: 页面展示
why:
close: "关闭"
diff --git a/data/webui_gallery.yml b/data/webui_gallery.yml
index 56ee44f5..4d4eb789 100644
--- a/data/webui_gallery.yml
+++ b/data/webui_gallery.yml
@@ -3,14 +3,14 @@
# One entry per screenshot, in the order the page lays them out. Two things read
# this file and they must not drift apart:
#
-# * app/views/pages/web_interface.html.erb, through WebuiGallery, to build the
-# tiles;
+# * the site, through `npm run export -w @openipc/site`, to build the tiles
+# of frontend/apps/site/src/components/pages/WebInterface.astro;
# * tools/webui-gallery, to know which pages of a camera to photograph.
#
# Adding a screenshot is therefore one edit here plus a run of the tool. See
# tools/webui-gallery/README.md.
#
-# slug basename of the pair in app/assets/images/webui/ --
+# slug basename of the pair in frontend/apps/site/src/assets/webui/ --
# .webp is the full 2560px capture, -thumb.webp the tile.
# caption the page's name as the camera prints it -- the word in the nav
# bar, prefixed by its menu where it has one, exactly as the page's
@@ -26,19 +26,42 @@
# at goes on the public site, so the tool lays a still picture over
# the player -- and fails the run if it cannot find one to cover,
# rather than quietly photographing the camera's own view when the
-# WebUI changes shape.
+# WebUI changes shape. A file name instead of true takes that
+# picture from tools/webui-gallery/scene/ for this page alone.
+# analytics a fixture in tools/webui-gallery/scene/: the boxes of the people
+# in this page's scene, answered on /ws/analytics in place of the
+# camera, so the WebUI's own overlay draws them. A staged screen --
+# the page that shows it says so.
screens:
- slug: dashboard
caption: Dashboard
cgi: dashboard.cgi
- settle: 2500
+ # The graphs are drawn from samples the page takes while it is open, over
+ # a two-minute window: shot sooner, they are empty axes.
+ settle: 100000
- slug: live
caption: Live
cgi: live.cgi
+ # The pan/tilt pad shows only on a camera with a head to turn, so this one
+ # is shot from such a camera, on its own:
+ # tools/webui-gallery/run.sh --camera --only live
settle: 14000
scene: true
+ - slug: recordings
+ caption: Recordings
+ cgi: recordings.cgi
+ settle: 9000
+ scene: true
+
+ - slug: motion-detection
+ caption: Camera - Settings - Motion detection
+ cgi: camera.cgi?tab=motionDetect
+ settle: 9000
+ scene: street.jpg
+ analytics: street.json
+
- slug: camera-settings
caption: Camera - Settings
cgi: camera.cgi
@@ -55,6 +78,11 @@ screens:
cgi: config.cgi
settle: 3000
+ - slug: sd-card
+ caption: System - SD Card
+ cgi: sdcard.cgi
+ settle: 4000
+
- slug: logs
caption: System - Logs
cgi: logs.cgi
@@ -89,3 +117,8 @@ screens:
caption: Services - Telegram
cgi: telegram.cgi
settle: 3000
+
+ - slug: openwall
+ caption: Services - OpenWall
+ cgi: openwall.cgi
+ settle: 3000
diff --git a/frontend/apps/site/public/video/person-tracking.mp4 b/frontend/apps/site/public/video/person-tracking.mp4
new file mode 100644
index 00000000..0d82f0e5
Binary files /dev/null and b/frontend/apps/site/public/video/person-tracking.mp4 differ
diff --git a/frontend/apps/site/public/video/person-tracking.webp b/frontend/apps/site/public/video/person-tracking.webp
new file mode 100644
index 00000000..07b11b19
Binary files /dev/null and b/frontend/apps/site/public/video/person-tracking.webp differ
diff --git a/frontend/apps/site/src/assets/webui/camera-settings-thumb.webp b/frontend/apps/site/src/assets/webui/camera-settings-thumb.webp
index 25e80fe4..40d5f569 100644
Binary files a/frontend/apps/site/src/assets/webui/camera-settings-thumb.webp and b/frontend/apps/site/src/assets/webui/camera-settings-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/camera-settings.webp b/frontend/apps/site/src/assets/webui/camera-settings.webp
index ceb238cf..2bdbc146 100644
Binary files a/frontend/apps/site/src/assets/webui/camera-settings.webp and b/frontend/apps/site/src/assets/webui/camera-settings.webp differ
diff --git a/frontend/apps/site/src/assets/webui/config-file-thumb.webp b/frontend/apps/site/src/assets/webui/config-file-thumb.webp
index bb5d7f0f..170ad569 100644
Binary files a/frontend/apps/site/src/assets/webui/config-file-thumb.webp and b/frontend/apps/site/src/assets/webui/config-file-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/config-file.webp b/frontend/apps/site/src/assets/webui/config-file.webp
index 7658129f..364cf1b1 100644
Binary files a/frontend/apps/site/src/assets/webui/config-file.webp and b/frontend/apps/site/src/assets/webui/config-file.webp differ
diff --git a/frontend/apps/site/src/assets/webui/console-thumb.webp b/frontend/apps/site/src/assets/webui/console-thumb.webp
index bb1de2ce..0b8259de 100644
Binary files a/frontend/apps/site/src/assets/webui/console-thumb.webp and b/frontend/apps/site/src/assets/webui/console-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/console.webp b/frontend/apps/site/src/assets/webui/console.webp
index 86dbbf0e..e4f87d5c 100644
Binary files a/frontend/apps/site/src/assets/webui/console.webp and b/frontend/apps/site/src/assets/webui/console.webp differ
diff --git a/frontend/apps/site/src/assets/webui/dashboard-thumb.webp b/frontend/apps/site/src/assets/webui/dashboard-thumb.webp
index 63dcfd64..c92aacdf 100644
Binary files a/frontend/apps/site/src/assets/webui/dashboard-thumb.webp and b/frontend/apps/site/src/assets/webui/dashboard-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/dashboard.webp b/frontend/apps/site/src/assets/webui/dashboard.webp
index 76bcba00..8788d129 100644
Binary files a/frontend/apps/site/src/assets/webui/dashboard.webp and b/frontend/apps/site/src/assets/webui/dashboard.webp differ
diff --git a/frontend/apps/site/src/assets/webui/file-manager-thumb.webp b/frontend/apps/site/src/assets/webui/file-manager-thumb.webp
index 6c2a34bc..f567f457 100644
Binary files a/frontend/apps/site/src/assets/webui/file-manager-thumb.webp and b/frontend/apps/site/src/assets/webui/file-manager-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/file-manager.webp b/frontend/apps/site/src/assets/webui/file-manager.webp
index cea3df07..b1b47906 100644
Binary files a/frontend/apps/site/src/assets/webui/file-manager.webp and b/frontend/apps/site/src/assets/webui/file-manager.webp differ
diff --git a/frontend/apps/site/src/assets/webui/firmware-update-thumb.webp b/frontend/apps/site/src/assets/webui/firmware-update-thumb.webp
index 9c73563d..7eb49a6b 100644
Binary files a/frontend/apps/site/src/assets/webui/firmware-update-thumb.webp and b/frontend/apps/site/src/assets/webui/firmware-update-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/firmware-update.webp b/frontend/apps/site/src/assets/webui/firmware-update.webp
index 00d458e2..d7e7802d 100644
Binary files a/frontend/apps/site/src/assets/webui/firmware-update.webp and b/frontend/apps/site/src/assets/webui/firmware-update.webp differ
diff --git a/frontend/apps/site/src/assets/webui/live-thumb.webp b/frontend/apps/site/src/assets/webui/live-thumb.webp
index 0be3e8a4..dd0bef3b 100644
Binary files a/frontend/apps/site/src/assets/webui/live-thumb.webp and b/frontend/apps/site/src/assets/webui/live-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/live.webp b/frontend/apps/site/src/assets/webui/live.webp
index d5a2ce3b..4d513de1 100644
Binary files a/frontend/apps/site/src/assets/webui/live.webp and b/frontend/apps/site/src/assets/webui/live.webp differ
diff --git a/frontend/apps/site/src/assets/webui/logs-thumb.webp b/frontend/apps/site/src/assets/webui/logs-thumb.webp
index 812ae0ef..fa21cf43 100644
Binary files a/frontend/apps/site/src/assets/webui/logs-thumb.webp and b/frontend/apps/site/src/assets/webui/logs-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/logs.webp b/frontend/apps/site/src/assets/webui/logs.webp
index 8d7b673a..02a26d46 100644
Binary files a/frontend/apps/site/src/assets/webui/logs.webp and b/frontend/apps/site/src/assets/webui/logs.webp differ
diff --git a/frontend/apps/site/src/assets/webui/motion-detection-thumb.webp b/frontend/apps/site/src/assets/webui/motion-detection-thumb.webp
new file mode 100644
index 00000000..08de353e
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/motion-detection-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/motion-detection.webp b/frontend/apps/site/src/assets/webui/motion-detection.webp
new file mode 100644
index 00000000..b7b9f4f7
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/motion-detection.webp differ
diff --git a/frontend/apps/site/src/assets/webui/network-thumb.webp b/frontend/apps/site/src/assets/webui/network-thumb.webp
index db016f6b..5620717b 100644
Binary files a/frontend/apps/site/src/assets/webui/network-thumb.webp and b/frontend/apps/site/src/assets/webui/network-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/network.webp b/frontend/apps/site/src/assets/webui/network.webp
index 8469cd8e..18fcd642 100644
Binary files a/frontend/apps/site/src/assets/webui/network.webp and b/frontend/apps/site/src/assets/webui/network.webp differ
diff --git a/frontend/apps/site/src/assets/webui/openwall-thumb.webp b/frontend/apps/site/src/assets/webui/openwall-thumb.webp
new file mode 100644
index 00000000..f4cf5e5a
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/openwall-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/openwall.webp b/frontend/apps/site/src/assets/webui/openwall.webp
new file mode 100644
index 00000000..b029e5ff
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/openwall.webp differ
diff --git a/frontend/apps/site/src/assets/webui/recordings-thumb.webp b/frontend/apps/site/src/assets/webui/recordings-thumb.webp
new file mode 100644
index 00000000..c820d970
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/recordings-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/recordings.webp b/frontend/apps/site/src/assets/webui/recordings.webp
new file mode 100644
index 00000000..1b95d5b7
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/recordings.webp differ
diff --git a/frontend/apps/site/src/assets/webui/sd-card-thumb.webp b/frontend/apps/site/src/assets/webui/sd-card-thumb.webp
new file mode 100644
index 00000000..07a0b2ec
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/sd-card-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/sd-card.webp b/frontend/apps/site/src/assets/webui/sd-card.webp
new file mode 100644
index 00000000..ca5253fc
Binary files /dev/null and b/frontend/apps/site/src/assets/webui/sd-card.webp differ
diff --git a/frontend/apps/site/src/assets/webui/stream-urls-thumb.webp b/frontend/apps/site/src/assets/webui/stream-urls-thumb.webp
index 47e48b55..9e5da0db 100644
Binary files a/frontend/apps/site/src/assets/webui/stream-urls-thumb.webp and b/frontend/apps/site/src/assets/webui/stream-urls-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/stream-urls.webp b/frontend/apps/site/src/assets/webui/stream-urls.webp
index 58effc15..a8874ea0 100644
Binary files a/frontend/apps/site/src/assets/webui/stream-urls.webp and b/frontend/apps/site/src/assets/webui/stream-urls.webp differ
diff --git a/frontend/apps/site/src/assets/webui/telegram-thumb.webp b/frontend/apps/site/src/assets/webui/telegram-thumb.webp
index e4087cf9..2e3d360f 100644
Binary files a/frontend/apps/site/src/assets/webui/telegram-thumb.webp and b/frontend/apps/site/src/assets/webui/telegram-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/telegram.webp b/frontend/apps/site/src/assets/webui/telegram.webp
index f9f3ffad..55158234 100644
Binary files a/frontend/apps/site/src/assets/webui/telegram.webp and b/frontend/apps/site/src/assets/webui/telegram.webp differ
diff --git a/frontend/apps/site/src/assets/webui/time-thumb.webp b/frontend/apps/site/src/assets/webui/time-thumb.webp
index fb1e9d5a..69e13d52 100644
Binary files a/frontend/apps/site/src/assets/webui/time-thumb.webp and b/frontend/apps/site/src/assets/webui/time-thumb.webp differ
diff --git a/frontend/apps/site/src/assets/webui/time.webp b/frontend/apps/site/src/assets/webui/time.webp
index 673dc478..0a6e7786 100644
Binary files a/frontend/apps/site/src/assets/webui/time.webp and b/frontend/apps/site/src/assets/webui/time.webp differ
diff --git a/frontend/apps/site/src/components/pages/WebInterface.astro b/frontend/apps/site/src/components/pages/WebInterface.astro
index df80f4fc..e848d004 100644
--- a/frontend/apps/site/src/components/pages/WebInterface.astro
+++ b/frontend/apps/site/src/components/pages/WebInterface.astro
@@ -8,10 +8,15 @@
* page cannot disagree about what the gallery
* contains.
*
- * The two pages with a live player show a beach rather than the bench of
- * cables the lab camera actually faces; see the credit under the grid. The
- * scene is laid over the