Skip to main content
Stretch Lab

Dashboards

Probing 26 services from this host.

The lab's services and the dashboards they serve, probed live.

sbl78 services, target host

  1. 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.

    Open
  2. 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.

    Open
  3. 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.

  4. 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.

    Open
  5. 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.

  6. 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.

  7. 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.

  8. 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

  1. 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.

    Open
  2. 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.

    Open
  3. 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.

  4. 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.

  5. Battery station run watcherchecking

    station-runwatch.service, ~/.local/bin/station_runwatch.py

    Announces when an unattended station run ends. Candidate to adopt into services/.

  6. 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.

    Open
  7. 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.

    Open
  8. 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.

    Open
  9. 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.

    Open
  10. 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.

  11. 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.

  12. 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.

  13. 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.

  14. 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.

    Open

stretch-se4-40001 service

  1. 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/.

    Open

battery-station.local1 service

  1. 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.

    Open

robot2 services, on each robot's NUC

  1. 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.

  2. 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.