You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix stale documentation across server, pecan, kvaser-bridge, and root docs
Audited docs against current code/config and corrected drift: sandbox
docs still described the removed Cohere integration instead of
MiniMax-M3 via the Anthropic-compatible API; several installer docs
referenced services that no longer exist (startup-data-loader,
timescaledb-explorer) or wrong env var names/ports/API routes
(health-monitor, data-downloader, kvaser-bridge WS port, comms-setup
path); root README referenced the removed pecan-bridge dir and was
missing livestream/; car-simulate port docs and pecan's CAN log format
decision doc were out of date with the shipped implementation.
Copy file name to clipboardExpand all lines: .hermes/plans/2026-05-21_124500-unified-health-endpoint.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,7 @@
1
1
# Unified Health Endpoint
2
2
3
+
> **Status: Implemented.** The `/health` endpoint exists (`universal-telemetry-software/src/status_server.py`), backed by `data.py` writing the health file, and the 8080 status page polls it every 2s (`universal-telemetry-software/status/index.html`). Documented in `universal-telemetry-software/README.md` and `deploy/MACBOOK_DEPLOY.md`. This plan is kept for historical context only.
4
+
3
5
## Goal
4
6
5
7
Replace the three independent, semi-redundant health detection mechanisms in the telemetry stack with a single `/health` HTTP JSON endpoint that aggregates the authoritative state of every pipeline component. Surface it in the existing 8080 status page UI in place of the current WebSocket-derived indicators.
Copy file name to clipboardExpand all lines: README.md
+7-3Lines changed: 7 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -130,9 +130,13 @@ Development and testing tools for simulating vehicle telemetry without physical
130
130
- Example DBC (CAN database) file for message definitions
131
131
- Docker Compose setups forisolated testing environments, including a dev/demo server configurationin`car-simulate/persistent-broadcast`
132
132
133
-
### CAN Adapter Bridges (`/kvaser-bridge`, `/pecan-bridge`)
133
+
### CAN Adapter Bridge (`/kvaser-bridge`)
134
134
135
-
GUI adapters for Kvaser and PECAN CAN hardware interfaces. Used during bench testing when physical vehicle hardware is unavailable.
135
+
GUI adapter that bridges a Kvaser CAN interface to the dashboard over WebSocket. Used during bench testing when physical vehicle hardware is unavailable.
136
+
137
+
### Livestream Overlay (`/livestream`)
138
+
139
+
OBS Browser Source overlay and setup notes for streaming telemetry alongside live race video. See `livestream/OBS-SETUP.md`.
Copy file name to clipboardExpand all lines: car-simulate/persistent-broadcast/README.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -153,7 +153,7 @@ asyncio.run(connect())
153
153
154
154
## Data Format
155
155
156
-
The server broadcasts batches of 100 CAN messages at 5 Hz. Each message has the following format:
156
+
The server broadcasts a mix of generators at different rates (accumulator at 10 Hz, standard-ID frames at 20 Hz, charger frames at 5 Hz), or replays a CSV file if `ENABLE_CSV=true`. Each message has the following format:
157
157
158
158
```json
159
159
{
@@ -184,8 +184,8 @@ docker-compose up -d --build
184
184
185
185
## Port Configuration
186
186
187
-
-**8080**: WebSocket (ws://) - unencrypted
188
-
-**8443**: Secure WebSocket (wss://) - encrypted
187
+
-**9080**: WebSocket (ws://) - unencrypted
188
+
-**9443**: Secure WebSocket (wss://) - encrypted
189
189
190
190
## Troubleshooting
191
191
@@ -207,8 +207,8 @@ docker-compose up -d --build
207
207
208
208
You can customize the following variables in `docker-compose.yml`:
209
209
210
-
-`WS_PORT`: WebSocket port (default: 8080)
211
-
-`WSS_PORT`: Secure WebSocket port (default: 8443)
210
+
-`WS_PORT`: WebSocket port (default: 9080)
211
+
-`WSS_PORT`: Secure WebSocket port (default: 9443)
Copy file name to clipboardExpand all lines: kvaser-bridge/README.md
+10-1Lines changed: 10 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,11 +33,20 @@ python src/main.py
33
33
A small window appears with:
34
34
-**Channel** - select which Kvaser CAN channel to use
35
35
-**Bitrate** - CAN bus bitrate (default 500k)
36
-
-**WS URL** - WebSocket URL of the dashboard (default `ws://localhost:9080`)
36
+
-**WS URL** - WebSocket URL of the dashboard (default `wss://127.0.0.1:9081`; TLS is on by default)
37
37
-**Start/Stop Bridge** - toggle the connection
38
38
39
39
Click **Start Bridge** to begin streaming CAN frames to the dashboard.
40
40
41
+
### Trusting the certificate (first run)
42
+
43
+
The bridge serves a self-signed TLS certificate over `wss://`, so the browser dashboard will refuse the connection until that certificate is trusted:
44
+
45
+
-**Windows**: click **Trust Certificate (Automatic)** to install it into the current-user Root store (no admin rights needed; works for Chrome/Edge). Use **Manual…** instead for Firefox, or if the automatic install fails.
46
+
-**Other platforms**: click **Trust Certificate** to open the bridge URL in the browser, then click through **Advanced → Proceed** and wait for the green "Certificate trusted" confirmation page.
47
+
48
+
Do this once per machine/browser before starting the bridge.
Copy file name to clipboardExpand all lines: pecan/docs/CAN_LOG_FORMAT_DECISION.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,7 @@
1
1
# PECAN CAN Log Format Decision
2
2
3
+
> **Status:** Phase 1 (PECAN CSV v1 machine columns) and Phase 4 (`.pecan` session container) are implemented — see `exportCsv()`/`exportPecanSession()` in `src/pages/Trace.tsx` and `src/utils/pecanSerializer.ts`/`src/utils/replayParser.ts`. The "Migration Note" and container `version` below are historical/outdated; the shipped container format is `version: 2` (`serializePecanV2`).
4
+
3
5
## Decision Summary
4
6
5
7
Use a machine-readable raw frame format as the canonical PECAN replay format.
Copy file name to clipboardExpand all lines: server/docs/containers/startup-data-loader.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,7 @@
1
1
# Startup data loader
2
2
3
+
> **Removed.** This service no longer exists in `server/installer/docker-compose.yml` and the `startup-data-loader/` directory it describes is gone. TimescaleDB now starts empty; use the `file-uploader` web UI (or the `data-downloader` scanner/API) to import CAN CSV archives. This doc is kept for historical reference only.
4
+
3
5
The startup data loader seeds TimescaleDB with a small, deterministic dataset on first boot. It can also backfill additional files if you mount them into the container.
│ lap-detector │ (disabled by default; opt in via --profile disabled)
28
+
└──────────────┘
21
29
```
22
30
23
-
All containers join the `datalink` bridge network, enabling them to communicate using Docker hostnames (for example `http://timescaledb:8181`).
31
+
All containers join the `datalink` bridge network, enabling them to communicate using Docker hostnames (for example `http://timescaledb:5432`). The actual service list lives in `installer/docker-compose.yml`; see the [service catalogue in the installer README](../installer/README.md#service-catalogue) for ports and one-line descriptions of each service.
24
32
25
33
## Volumes
26
34
27
35
| Volume | Mounted by | Purpose |
28
36
| --- | --- | --- |
29
37
|`timescaledb-data`|`timescaledb`| Persists TimescaleDB metadata and stored telemetry. |
30
-
|`timescaledb-explorer-db`|`timescaledb-explorer`| Keeps explorer UI preferences. |
31
38
|`grafana-storage`|`grafana`| Stores dashboards, plugins, and Grafana state. |
39
+
|`code-generator-chroma`|`code-generator`| Persists the ChromaDB RAG index used for code generation. |
40
+
|`code-generator-cache`|`code-generator`| Persists the diskcache used to avoid re-generating identical requests. |
32
41
33
42
Remove volumes with `docker compose down -v` if you need a clean slate.
34
43
@@ -42,14 +51,13 @@ The Slack bot relies on valid `SLACK_APP_TOKEN` and `SLACK_BOT_TOKEN` values. Le
42
51
43
52
## Health checks
44
53
45
-
-`timescaledb` exposes a TCP healthcheck on port 8181 to ensure the database is reachable before dependants start.
46
-
-`startup-data-loader` waits an additional 5 seconds (`sleep 5`) to give TimescaleDB time to finish booting before loading the sample data.
54
+
-`timescaledb` runs `pg_isready` against port 5432 to ensure the database is reachable before dependants start (`data-downloader-api` and `health-monitor` wait on `service_healthy`).
47
55
48
56
## Customisation tips
49
57
50
58
- Override exposed ports in `docker-compose.override.yml` if default host ports conflict with local services.
51
59
- Drop in custom dashboards under `installer/grafana/dashboards/`—Grafana auto-imports JSON files at startup.
52
-
-Swap the example dataset in `installer/startup-data-loader/data/` for real telemetry and update `example.dbc` to match your CAN specification.
60
+
-Import real telemetry via the `file-uploader` web UI, and update `example.dbc` (or set `GITHUB_DBC_PATH`) to match your CAN specification.
53
61
54
62
## Useful commands
55
63
@@ -59,7 +67,7 @@ cd installer
59
67
docker compose config
60
68
61
69
# Tail logs for a specific service
62
-
docker compose logs -f startup-data-loader
70
+
docker compose logs -f code-generator
63
71
64
72
# Execute a shell inside the TimescaleDB container
Copy file name to clipboardExpand all lines: server/installer/LOCAL_STACK.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,7 @@
1
1
# Local Stack — Offline Testing Guide
2
2
3
+
> **Note:** This guide references `docker-compose.local.yml`, which does not currently exist in `server/installer/` (only `docker-compose.yml`, the full stack, is present). Create that override file yourself (scoping it to `timescaledb`, `grafana`, and `file-uploader`) before following the steps below, or run the equivalent `docker compose -f docker-compose.yml up -d timescaledb grafana file-uploader` against the full compose file instead.
4
+
3
5
Minimal stack for testing without internet: TimescaleDB, Grafana, and file-uploader only.
0 commit comments