Viewer URL parameters & transport
Query parameters you can append to a Wallflower.tv watch or broadcast URL, and how the
origin → edge transport hint (xport) works. Developer reference.
Watch / broadcast selectors
| Parameter | Example | Meaning |
|---|---|---|
stream | ?stream=ab5ki |
Broadcast as a given 5-char stream id (broadcaster path). |
node | ?node=<52-char key> |
Watch a broadcast by its stream key — the broadcaster's Ed25519 public key
rendered as base32(publicKey), minted in the browser. Your browser resolves the key to a live
origin off the public Mainline DHT (a signed pkarr record; no directory server). The key
is itself the capability to watch. This is distinct from the origin relay's own iroh EndpointId, which is a
transport address, not the stream name. |
viewer-cdn | ?viewer-cdn=ams.gpcmoq.com |
Selects which provisioning fleet serves this viewer's edge. If it differs from the
publisher's origin relay, that fleet provisions a cross-cluster edge that pulls from the origin
(Mode B). Provisioning — assigning that edge — is separate from discovery (which is the DHT
resolve above) and runs in one of two modes: brokered (the app calls the tinymoq Worker, which
brokers a fleet box and stays content-blind) or direct (the app calls its own fleet box's
/assign). The two modes interoperate through the DHT. |
publisher-cdn | ?publisher-cdn=ams.gpcmoq.com |
Selects which provisioning fleet the broadcaster's origin is assigned on (broadcaster path). Must be an allowed fleet host. |
origin | ?origin=host:port |
Testing override: force the origin the edge pulls from (normally derived by the Worker). |
xport transport hint | ?xport=iroh |
Selects the origin → edge transport. See below. |
xport — origin → edge transport hint
On a cross-cluster (?viewer-cdn=) or enterprise watch URL, xport tells the
TinyMoQ CDN how the edge should pull the stream from the origin:
| Value | Effect |
|---|---|
iroh | The edge pulls from the origin over iroh — mainline-DHT discovery, NAT-friendly, so the origin needs no public host:port. |
| (absent / any other value) | Default: the edge pulls over native
QUIC by host:port. The request is byte-identical to a URL with no
xport at all. |
How the hint travels (it is forwarded verbatim, never interpreted client-side):
Mode B (?viewer-cdn=):
browser URL ?xport=iroh
-> GET /api/streams/<id>/route?viewer-cdn=…&xport=iroh (player)
-> Worker /route reads xport, calls assignRelay(…, xport)
-> GET https://<edge>/assign?broadcast=…&xport=iroh (server-side)
Mode C (enterprise, on-net edge):
browser URL ?xport=iroh
-> GET https://<relay>/assign?broadcast=…&xport=iroh (browser preflight)
Two things people get wrong:
- The
Connected: <edge>:<port>/Mode: WebTransportline is the browser ↔ edge hop, and it is always WebTransport — regardless ofxport. It is not a fallback indicator.xportonly affects the separate origin → edge hop. xportis a non-secret transport hint. It changes no tokens and no auth. Access is still gated by the per-broadcast token, and the media is still end-to-end encrypted with a content key no relay ever sees.
"Origin link" stats line
For a cross-cluster watch, the player confirms the actual origin → edge transport
by polling a public, read-only endpoint on the edge (~1.5 s after connect, re-polling every 5 s;
the line is hidden on unknown or any error):
GET https://<edge-host>/edge_xport?broadcast=<rawBroadcastId>
(port 443, no auth, CORS *; the broadcast id is substring-matched)
-> { "xport": "iroh" | "quic" | "unknown", "origin": "<host:port>" }
It renders one of:
xport | Stats line shown |
|---|---|
iroh | Origin link: iroh / DHT |
quic | Origin link: <origin> (QUIC) |
unknown / error | (line hidden) |
See also
Full architecture (PDF) — infrastructure, routing & the
three-hop transport model that xport plugs into.