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
The dashboard is a thin client over this API. Every fault-injection action, every shaping change, every session control the UI exposes is available here — so anything you can do in the browser, a test script or CI job can do too. There are no UI-only controls.
All endpoints are exposed through nginx on port 30000 (Docker Compose and k3d release) or 40000 (k3d dev). nginx routes them to the backing service based on path.
For the fault-injection surface (/api/session/* patch payloads, /api/nftables/* shaping), see docs/FAULT_INJECTION.md — this page only summarises those endpoints and points to the full reference.
go-live (manifest generation)
Prefix: /go-live/
Method
Path
Purpose
GET
/go-live/healthz
Liveness check
GET
/go-live/api/status
All active workers, streams, and per-stream stats
GET
/go-live/api/tick-stats/{content}
LL-HLS tick cadence for one content worker (last tick, 5m avg, variant/audio counts)
These let the dashboard and the native client apps work with a Cloudflare Worker rendezvous (cloudflare/pair-rendezvous/). See README.md for the user-facing flow.
Method
Path
Purpose
GET
/api/rendezvous
Returns {url, label} — the configured rendezvous Worker URL and this server's announce label. Used by the dashboard's "Pair a TV" widget and Server Info title.
POST
/api/announce-now
Triggers an immediate, coalesced announce to the rendezvous (in addition to the periodic loop). Called by the dashboard's Server Info modal so users can recover from a missed boot announce. Returns {ok:true}.
{session_ids:[...], group_id?:"..."} — creates or extends a group (max 10)
POST
/api/session-group/unlink
{session_id:"..."}
GET
/api/session-group/{groupId}
Members
Network shaping (tc / nftables)
Method
Path
Purpose
GET
/api/nftables/capabilities
Is shaping available on this host? (Linux only)
GET
/api/nftables/status
Per-port state across all sessions
GET
/api/nftables/port/{port}
One port's shaping config
POST
/api/nftables/bandwidth/{port}
{rate_mbps}
POST
/api/nftables/loss/{port}
{percent}
POST
/api/nftables/shape/{port}
Full shape config
POST
/api/nftables/pattern/{port}
Step-pattern config
Diagnostics
Method
Path
Purpose
GET
/api/external-ips
Rolling + lifetime unique client IPs seen
GET
/api/version
Build version / commit SHA
GET
/debug
Internal debug HTML dashboard
Server-side RTT fields (issue #401)
Every /api/sessions row and SSE snapshot carries six TCP_INFO-derived RTT metrics, in milliseconds. Sampled inside go-proxy by a 100 ms ticker that calls getsockopt(TCP_INFO) on each session's most-recent connection and folds the reads into a 1 s window drained on every snapshot tick. Linux-only; the macOS dev build emits zeros.
Field
Source
Meaning
client_rtt_ms
window-avg of tcpi_rtt
Smoothed RTT (RFC 6298 SRTT, kernel EWMA)
client_rtt_max_ms
window-max of tcpi_rtt
Peak smoothed RTT in window — sub-second spike detector
client_rtt_min_ms
window-min of tcpi_rtt
Trough during the window
client_rtt_min_lifetime_ms
tcpi_min_rtt
Min RTT ever observed on this connection — path floor
client_rtt_var_ms
tcpi_rttvar
Smoothed mean deviation (jitter)
client_rto_ms
tcpi_rto
Current retransmit timeout — rises during a wedge
client_path_ping_rtt_ms
ICMP echo, 1 Hz
Out-of-band path latency (issue #404), independent of throttle — zero / absent when ICMP is filtered
If a 1 s window had no fresh kernel samples (typically a short connection gap), the row carries client_rtt_stale: true alongside the previous-window values.
CORS and caching
All API responses include Access-Control-Allow-Origin: * and Cache-Control: no-cache, no-store, must-revalidate headers (applied by nginx). Media segments are the exception — they are immutable and served with expires 1y.