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

ParameterExampleMeaning
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:

ValueEffect
irohThe 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:

"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:

xportStats line shown
irohOrigin link: iroh / DHT
quicOrigin link: <origin> (QUIC)
unknown / error(line hidden)

See also

Full architecture (PDF) — infrastructure, routing & the three-hop transport model that xport plugs into.