Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

x.uma

Alpha (0.0.2) — API is stabilizing. Expect breaking changes before 1.0.

One matcher engine. Five implementations. Same semantics everywhere.

x.uma implements the xDS Unified Matcher API — the same matching protocol Envoy uses at Google scale — across Rust, Python, and TypeScript.

Write matching rules once. Evaluate them in any language. Get the same answer every time.

Context → DataInput → MatchingData → InputMatcher → bool
           domain-      erased         domain-
           specific                    agnostic

An ExactMatcher doesn’t know whether it’s matching HTTP paths, Claude Code hook events, or your custom domain. It matches data. The domain-specific part — extracting that data from your context — is a separate port.

Implementations

PackageLanguageWhat it is
rumiRustCore engine (reference implementation)
xumaPython 3.12+Pure Python, zero native deps beyond RE2
xumaTypeScript/BunPure TypeScript, zero native deps beyond RE2
xuma-crustPythonRust bindings via PyO3
xuma-crustTypeScriptRust bindings via WASM

All five pass the same conformance test suite (~958 tests total).

Get Started

  • Rustrumi + rumi-http in your Cargo.toml
  • Pythonuv add xuma, build a matcher in 10 lines
  • TypeScriptbun add xuma, same API shape as Python

Guarantees

GuaranteeHow
No ReDoSRust regex crate (linear time). Python uses google-re2. TypeScript uses re2js.
Bounded depthMax 32 levels of nesting, validated at config load
Fail-closedMissing data → predicate returns false. Never matches by accident.
Thread-safeAll types are Send + Sync (Rust) / immutable (Python, TypeScript)