Dashboards
Probing 26 services from this host.
The lab's services and the dashboards they serve, probed live.
Each row shows three facts that can disagree: what the registry says the service should be, whether its systemd unit is active, and whether its port answers. The lamp is lit only when the unit and the port agree.
Front door: sbl7.local on sbl7.
sbl78 services, target host
- :80Open
sbl7.local front door (nginx on :80)checking:80
nginx.service, platform/sbl7/
/ -> website (3417), /wifi/ -> netwatch console (8799), /healthz. Installed by platform/sbl7/install.sh.
- :3417Open
Stretch Lab dashboard (Next.js dev)checking:3417
stretch-dashboard.service, dashboard/
The website, served through nginx at sbl7.local/. `npm run dev` because output:export needs the dev server for live API routes. User unit for curious (linger on). Moved from sbl6 2026-09-04.
Lab network dropout loggerchecking
netwatch.service, services/netwatch/
Wired observer on sbl7 since 2026-09-04 (iface null): AP, gateway and WAN hops probed separately. Source adopted into services/netwatch the same day; sbl7 still runs the ~/wifi_watch copy until deploy.py --apply is run there. run.env and *.creds are per-host and not in git.
- :8799Open
netwatch consolechecking:8799
netwatch-ui.service, services/netwatch/netwatch_ui.py
Team URL http://sbl7.local/wifi/ (nginx on sbl7 in front of 127.0.0.1:8799). stretch-lab.local:8799 and /wifi redirect there.
netwatch UniFi pollerchecking
netwatch-unifi.service, services/netwatch/unifi_poll.py
Reads the UniFi controller classic API every 30 s with a read-only API key (unifi.creds, per host). Writes clients/radios/neighbours CSVs and the controller event feed into the netwatch run dir.
netwatch weekly rotationchecking
netwatch-rotate.timer, services/netwatch/rotate.sh
Mon 04:07: close the run, write its report, gzip CSVs, prune (KEEP_RUNS=52 then BUDGET_GB=15), start the next week. deploy.py installs the timer and its service together.
netwatch database pollerchecking
netwatch-db.service, services/netwatch/unifi_db.py
Every 30-60 s: all per-client / per-radio / per-SSID / gateway / path-monitor telemetry the controller exposes, the app's 5-min WAN and airtime series, events, known clients and netwatch's own probe rollups into ~/lab-var/netwatch/netwatch.db (SQLite, WAL). Read-only against the controller. Schema and tiers in services/netwatch/netdb.py.
netwatch database maintenancechecking
netwatch-db-maintain.timer, services/netwatch/netdb.py
Hourly at :07: rolls raw samples up into forever-kept hourly tables, exports each completed month of raw rows to ~/lab-var/netwatch/archive/*.sqlite.gz, prunes raw oldest-day-first past NETWATCH_RAW_GB (15) or NETWATCH_RAW_DAYS (365). netdb.py stats shows growth per month.
Each row shows three facts that can disagree: what the registry says the service should be, whether its systemd unit is active, and whether its port answers. The lamp is lit only when the unit and the port agree.
Front door: sbl7.local on sbl7.
sbl614 services
- :80Open
sbl6.local front door (nginx on :80)checking:80
nginx.service, platform/sbl6/
Index of the bench tools with a lamp per tool; /discharge/ -> 8793, /bms/ -> 8792, /motor-load/ -> 8794, /pimu-cycle/ -> 8795, /rig/ -> 8798. Installed by platform/sbl6/install.sh.
- :80Open
stretch-lab.local (redirecting to sbl7.local)checking:80
nginx.service + stretch-lab-mdns.service, registered stale, platform/portal/
Since 2026-09-04 every path 302s to http://sbl7.local/ so bookmarks land. Retire the site file and the stretch-lab-mdns publisher on 2026-10-04. /_portal/healthz still answers locally.
- :3417
Website dev server on sbl6checking:3417
stretch-dashboard.service, registered on-demand, dashboard/
Same unit as sbl7's, run while developing on sbl6. Not the public site.
Battery station telemetry archiverchecking
station-archiver.service, ~/.local/share/station-archiver (detached worktree of stretch4_battery_station)
Writes ~/stretch_station_logs/station.db. Runs from a detached worktree on purpose so branch switching in the dev clone cannot change the importer.
Battery station run watcherchecking
station-runwatch.service, ~/.local/bin/station_runwatch.py
Announces when an unattended station run ends. Candidate to adopt into services/.
- :8792Open
USB-RS485 BMS readerchecking:8792
scripts/stretch_lab_desktop.py, registered on-demand, services/pimu-bms-reader/
JSON API only (no page of its own); the dashboard BMS page reads it. Reached as sbl6.local/bms/api/bms/latest.
- :8793Open
DL3021 constant-power dischargechecking:8793
scripts/stretch_lab_desktop.py, registered on-demand, services/battery-discharge/
Reached as sbl6.local/discharge/ (GUI fetches are relative since 2026-09-04). Technician GUI was also seen on 8796 in earlier sessions; confirm which port the current build uses.
- :8794Open
Motor-load battery cycle rigchecking:8794
scripts/stretch_lab_desktop.py, registered on-demand, services/battery-cycle-motor-load/
API only; the page is the website's /motor-load, which fetches http://sbl6.local/motor-load by default.
- :8795Open
PIMU resistor cyclechecking:8795
scripts/stretch_lab_desktop.py, registered on-demand, dashboard/src/lib/pimu-cycle-api.ts
API only; the page is the website's /pimu-cycle, which fetches http://sbl6.local/pimu-cycle by default.
Stretch Body serverchecking
stretch_body_server.service, registered disabled, ~/repos/stretch4_body
Disabled 2026-09-04 after 7277 auto-restarts with no robot attached to sbl6. Re-enable (systemctl --user enable --now stretch_body_server) when a robot body is plugged into this machine.
- :7447
Stretch ROS2 Zenoh routerchecking:7447
stretch-ros2-zenoh-router.service, ~/ament_ws
No established clients on :7447 when checked 2026-09-04. Robots run their own ROS 2 stack; if nothing uses this router by 2026-09-18, disable it.
Push-to-talk speech-to-text clientchecking
voice-stt-client.service, ~/.config/systemd/user/voice-stt-client.service
Backend is sbl7 (10.1.10.23): whisper-server.service (whisper.cpp CUDA) + stt-adapter.service on :9878, rebuilt 2026-09-03.
- :3389
Remote desktop (GNOME RDP, Tailscale only)checking:3389
gnome-remote-desktop + rdp-guard.service, /etc/systemd/system/rdp-guard.service
rdp-guard restricts 3389 to loopback and the tailnet.
- :8800Open
Ideogram render harness portalchecking:8800
ideogram-portal.service, ~/ideogram-harness/portal/
Personal side project (history.too.foo). Not part of the Hello Robot portal; listed so the port is not reused. Weights are 26 GB and re-downloadable.
stretch-se4-40001 service
- :8798Open
Power-state FMEA rig console (rev-3)checking:8798
psf-console.service, registered disabled, services/power-state-fmea/scripts/station.py
Rig NUC (S4RIG_v3) is stretch-se4-4000 (10.1.10.7, decided 2026-09-04): the relay controller, sense board, cameras and Shellys hang off it, so the console runs there, not on sbl6. Disabled until the v3 rig is wired. SAFETY: TimeoutStopSec=90 so relays park on stop. Page still uses absolute /api/ paths; convert before putting it under /rig/.
battery-station.local1 service
- :80Open
Stretch4 battery station (ESP device)checking:80
no unit, registered external, ~/repos/stretch4_battery_station
Separate device on Hello Robot 2.4 wifi; not proxied (mDNS name, nginx cannot resolve it at start). Link only.
robot2 services, on each robot's NUC
- :8788
stretch-bridge (robot HTTP bridge)checking:8788
stretch-bridge.service, registered on-demand, services/stretch-bridge/
Runs on the robot NUC; the nuc-powerd and robot pages talk to it.
Fleet USB power recorder + viewerchecking
stretch-usb-power-logger.service / stretch-usb-power-viewer.service, registered on-demand, services/usb-power-monitor/
Recorder runs on robots; collected/ is a symlink to ~/lab-var/stretch_lab/usb-power-monitor/collected (5.2 GB after merging the Jetson copy 2026-09-03).
Retired: PIMU battery station (launcher-managed local copy) (now battery-station); Power-cycle rig console (rev-1, stale) (now psf-console). Their purpose was fulfilled or merged into another service; the registry keeps them so their ports are not reused by mistake.