open-standards/wai/quickstart
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 3adb3e92a7
Some checks failed
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 10s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 1m1s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Failing after 4m20s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 4m57s
wai conformance records: CI signs WAI's own per-suite records with WAI's key and publishes them
The WAI site's list of conforming implementations (/conformance/) admits a record only when it
verifies, names the pinned commit and toolchain, is admitted against that commit's corpus, is
not signed by a published test key and names no local path. CI made no such record: the
conformance runner job of wai-breaking.yml wrote its per-suite records to the runner's temporary
folder, signed with keys made for their runs and naming the runner's paths, and uploaded none;
wai-conformance.yml's independent-verifiers artefact holds whole-corpus records, which §4.1
rule 4 refuses.

wai/quickstart/conformance-records.sh runs WAI's own implementations as that job does (the five
independent verifiers, the reference packager, the native sink through its module and its C
interface, the score renderer, the browser sink, the integer-synthesis decoder, a cache in front
of the reference origin, and the reference relay at drafts 22, 18 and 16), each record naming
<wai version>+<commit>, signed with the seed in WAI_CONFORMANCE_SEED and admitted by
`wai verify --conformant`, and packs the 15 as wai-conformance-<label>.tar.gz (with
MANIFEST.json: commit, standard, signer, each record's SHA-256) and its .sha256. The runs are
made from a folder holding bin/ and a link to wai/, programs found through PATH's relative
`bin`, so a record names bin/<program> and wai/<path>; a record holding a path under /Users/,
/Volumes/, /home/, /private/ or /tmp/, or such a python3, stops it. The seed goes to a file
only the script reads, removed on exit, and the variable is unset before anything runs.
Without the seed: one notice, nothing written, exit 0. A seed that is not one, or a key
conform-result-conformance publishes, stops it with nothing written.

- wai-breaking.yml, runner job: the three refusals planted on every change; on a push to main
  the pack at the commit, kept as the artefact wai-conformance-records when the secret is set.
- wai-release.yml: job conformance builds the programs at a wai-v* tag, runs and signs them
  (the seed in that step alone) and attaches wai-conformance-<version>.tar.gz and its .sha256
  through publish.sh, to FORGE_API directly. Job setup reports whether WAI_CONFORMANCE_SEED is
  set, as for WAI_PACKAGES_TOKEN (cc1849097): without it one notice, and the job is skipped.
- publish.sh: the release's description names the pack.

Checked: PyYAML parses both workflows; check-workflow-concurrency.sh and its selftest,
check-tests-in-ci.py and its selftest, check-wai-release-quickstart.py and its selftest, the
changelog check, the public-name check with the private list and the other light checks of
repo-checks.yml pass under bash.

Proved end to end at this change (as f5038ea40, before the rebase onto 8da651a54, which touches
none of these files), with a throwaway key made on the Framework build host and deleted there:
the script, run as the release job runs it, wrote 15 records, every one conformant, admitted
against the corpus (areas trust 5, media 2, delivery 2, live 6), path-neutral (bin/<program>,
wai/<path>, /usr/bin/python3) and signed by the key, packed with its SHA-256. The WAI site's
sync (scripts/sync-conform.mjs, on the M3 Ultra) admitted all 15 as WAI's own by --records with
--signer, and the same 15 by --release from a server laid out as the forge's release downloads;
the built page held each (check-conform, and the page's e2e: 102 checks). Planted and caught:
the script with no seed (one notice, nothing written, exit 0) and with the published test key
(exit 1, nothing written); at the sync, a record naming a local path (check f), a record signed
by the test key (check e, also with that key named as WAI's) and a pack whose .sha256 does not
match (refused by --release).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-10 03:11:58 -05:00
..
test archive_doctor.py starts the relay and the room service once before the doctor, so their first start is not the doctor's 6 s 2026-11-09 22:19:35 -05:00
build-libwai.sh wai release: libwai for C, the Swift package by URL and checksum, the Android library published, and the relay's and room service's images 2026-11-09 18:25:22 -05:00
build-studio.sh wai/toolchain-fixes, converted to the layout of the fix: no shared append point 2026-11-05 01:45:34 -05:00
build-web.sh wai: the developer's path, hello, create, dev and verify, a floor build with no system library, and nine examples 2026-10-26 22:58:39 -04:00
build.sh wai doctor: whether this machine can run the toolchain, one check to a line 2026-11-06 17:24:16 -05:00
conformance-records.sh wai conformance records: CI signs WAI's own per-suite records with WAI's key and publishes them 2026-11-10 03:11:58 -05:00
formulae.py wai/toolchain-fixes, converted to the layout of the fix: no shared append point 2026-11-05 01:45:34 -05:00
install.sh wai 0.6.0 2026-11-09 16:17:06 -05:00
libwai.md wai release: libwai for C, the Swift package by URL and checksum, the Android library published, and the relay's and room service's images 2026-11-09 18:25:22 -05:00
libwai_interface.py wai.h: the header holds the C interface alone 2026-11-09 18:21:14 -05:00
oci-push.py wai release: libwai for C, the Swift package by URL and checksum, the Android library published, and the relay's and room service's images 2026-11-09 18:25:22 -05:00
publish.sh wai conformance records: CI signs WAI's own per-suite records with WAI's key and publishes them 2026-11-10 03:11:58 -05:00
README.md wai doctor: a browser counts when it runs, and on Windows a hung program's tree is stopped 2026-11-06 17:24:17 -05:00
release-images.sh wai release: libwai for C, the Swift package by URL and checksum, the Android library published, and the relay's and room service's images 2026-11-09 18:25:22 -05:00

WAI

The wai command line, and the reference software wai dev runs on your own machine. All of it is open source under Apache-2.0, built from the open-standards repository (wai/quickstart/build.sh).

File What it is
bin/wai The command line: hello, create, dev, verify, doctor, and the envelope tools (inspect, wrap, unwrap, encode, decode for the mandatory floor, capabilities)
bin/wai-relay The relay a room's media goes through: MOQT over QUIC, WebTransport and WebSocket
bin/wai-room The room service: a room's keys, its grants, its clock
bin/wai-ingest The ingest gateway: WHIP, SRT and RTMP into a room, each group signed at the first hop, and WHEP out
bin/wai-remote-host A remote desktop room's host agent
bin/wai-pack The packager: a title as WAI objects, HTTP playlists and a MoQ catalog
bin/wai-quantum The quantum command line: OpenQASM programs run on this machine, the result signed
share/wai/web/ The room client a browser loads: its pages and their WebAssembly
share/wai/studio/ WAI Studio, which wai dev serves at /_wai/

Start

wai hello                                   # WAI's four steps on a sample: name, dispatch, rebuild, receipt
wai create my-room --template video-room    # a video room in one page
cd my-room
wai dev                                     # the relay, the room service and your page, on 127.0.0.1:8080
wai verify ../wai-hello                     # the receipts hello wrote, checked offline

wai create --list names every template. wai dev --help gives its options. Nothing here needs an account, and nothing is sent off your machine.

Keep bin/ and share/ side by side: wai dev finds the relay, the room service, the room client and Studio beside itself. Homebrew and Scoop install wai-quantum as a package of its own, which wai depends on.

Check this machine

wai doctor                                  # one check to a line; --json for the same as an envelope

says whether this machine can run all of this: this wai and what wai reaches at a prompt, the relay and the room service and whether they are of this wai's version, each port in the table below, the browsers for Studio and for the browser harnesses, each asked its version and passed only when one runs, and where wai key keeps keys and who else may reach them. A check that fails says what to do. One that could not be run reads "not checked" with the reason, which is not a pass, and the last line says which of the three the run came to: passed, failed, or passed with some not checked. It exits 1 when a check failed. It sends nothing off this machine, writes nothing, reads no secret and raises no prompt, so on macOS whether the login keychain is unlocked always reads not checked, and a browser that would open a window to say its version (a WebKit browser, and on Windows any windowed program) is not started and says so.

Ports

What each program listens on by default, on 127.0.0.1. wai dev serves everything on one origin and runs its own relay and room service on free ports behind it; the other rows are each daemon's own default, as its example configuration or its source sets it, for running it alone. No two of them share a port, so any of them run side by side. A deployment sets its own.

Port Program What Set by
8080 wai dev your page at /, the room service at /room-api/, the relay at /moq, Studio at /_wai/ --port
4443/udp wai-relay MOQT over QUIC, and WebTransport quic_listen
4480 wai-relay MOQT over WebSocket websocket_listen
9682 wai-room the room service's HTTP API listen
8088 wai-ingest WHIP and WHEP [http] listen
1935 wai-ingest RTMP [rtmp] listen
1936 wai-ingest RTMPS, off until set [rtmp] tls_listen
5167 wai-ingest SCTE 104 automation, off until set [injector] listen
9000/udp wai-ingest SRT, off until set [contrib.srt] listen
9694 wai-audit the audit collector WAI_AUDIT_ADDR
8251 wai-ledger the receipt ledger WAI_LEDGER_ADDR
8252 wai-fleet the fleet service WAI_FLEET_ADDR
8241 wai-quantum-service the quantum job service WAI_QSVC_ADDR
9670 wai-world-relay the interactive worlds' relay WAI_RELAY_BIND
9690 wai_stitched_presentation serve the stitched presentation verifier --listen
8380 wai http origin an HTTP origin of WAI objects --port

A program that reaches another names that one's port: the room service's relay_url is the relay's WebSocket (ws://127.0.0.1:4480/moq), and the ingest gateway's [relay] addr is the relay's QUIC endpoint (127.0.0.1:4443). joule-moq-room's tests/ports.rs holds every row to the program that serves it.

More