Skip to content

Architecture

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/O

The 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.

@moqtap/codec ← wire codec, drafts 07–17, zero dependencies
@moqtap/trace ← .moqtrace format, session recorder

The Browser Extension uses @moqtap/codec and @moqtap/trace for real-time decoding of WebTransport connections in the browser.

  • Codec is puremoqtap-codec has 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 transport module.
  • Proxy observes without statemoqtap-proxy parses MoQT frames inline without buffering, emitting structured ProxyEvents. 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.
User → moqtap peek → moqtap-client → quinn (QUIC) → MoQT Relay
User ← terminal output ← TraceEvent ← quinn
MoQT Client → moqtap-proxy (listener) → moqtap-proxy (upstream) → MoQT Relay
↓ ↓
ProxyEvent → terminal output / .moqtrace file
User (Vue UI) → Tauri IPC → Rust commands → quinn (QUIC) → MoQT Relay
User (Vue UI) ← Tauri events (60Hz batched) ← TraceEvent ← quinn
Page JS → content.ts (hooks WebTransport) → bridge → background.ts (decode + record)
DevTools panel (Vue 3 UI)