Architecture
Rust crate dependency graph
Section titled “Rust crate dependency graph”moqtap-codec (MIT) ← pure codec, no I/O. Drafts 07–17. │ ├── moqtap-client (MIT) ← outbound QUIC/WebTransport MoQT client │ ├── moqtap-proxy (MIT) ← transparent intercepting proxy framework │ (uses codec + client's transport layer) │ └── moqtap-trace (MIT) ← TraceEvent model, .moqtrace file I/OThe CLI (moqtap-cli) ties the four crates together, providing peek (uses moqtap-client) and intercept (uses moqtap-proxy) commands, with optional .moqtrace output via moqtap-trace.
The Desktop app uses moqtap-client and moqtap-proxy via Tauri IPC, with a Vue 3 frontend and auto-generated TypeScript bindings via tauri-specta.
JavaScript library graph
Section titled “JavaScript library graph”@moqtap/codec ← wire codec, drafts 07–17, zero dependencies ↓@moqtap/trace ← .moqtrace format, session recorderThe Browser Extension uses @moqtap/codec and @moqtap/trace for real-time decoding of WebTransport connections in the browser.
Design principles
Section titled “Design principles”- Codec is pure —
moqtap-codechas zero runtime dependencies. It’s just bytes in, structs out. - Lenient parsing — unknown fields produce warnings, not errors. A debug tool must show you what’s wrong.
- quinn for QUIC, wtransport for WebTransport — both are shared across drafts through the client’s
transportmodule. - Proxy observes without state —
moqtap-proxyparses MoQT frames inline without buffering, emitting structuredProxyEvents. It forwards traffic unmodified by default. - Multi-draft — codecs support drafts 07–17 via feature flags (Rust) or subpath imports (JS). Draft-specific logic is isolated so adding new drafts is additive.
- Auto-generated types — TypeScript types for the desktop app are derived from Rust structs via
tauri-specta, ensuring the IPC contract never drifts.
Data flow
Section titled “Data flow”CLI — peek mode
Section titled “CLI — peek mode”User → moqtap peek → moqtap-client → quinn (QUIC) → MoQT Relay ↓User ← terminal output ← TraceEvent ← quinnCLI — intercept mode
Section titled “CLI — intercept mode”MoQT Client → moqtap-proxy (listener) → moqtap-proxy (upstream) → MoQT Relay ↓ ↓ ProxyEvent → terminal output / .moqtrace fileDesktop app
Section titled “Desktop app”User (Vue UI) → Tauri IPC → Rust commands → quinn (QUIC) → MoQT Relay ↓User (Vue UI) ← Tauri events (60Hz batched) ← TraceEvent ← quinnBrowser extension
Section titled “Browser extension”Page JS → content.ts (hooks WebTransport) → bridge → background.ts (decode + record) ↓ DevTools panel (Vue 3 UI)