Try the same guardTool, taint labels and policy engine you ship, in a browser tab with no server. The store is in-memory SQLite (sql.js, WebAssembly) and signing uses WebCrypto Ed25519, so nothing leaves the page.
The build writes static files to apps/playground/dist. Host them anywhere.
Try the demo scenarios
- A poisoned web page tells the agent to email an attacker. The address carries the
untrusted_web label, so the taint rule blocks the call.
- A 20 EUR payment stays under the limit and is allowed.
- A 5000 EUR payment reaches the
large-payment risk tier and escalates to approval.
- Edit the policy JSON and run again.
Each run shows the decision, the reason, the labels the engine saw, and a signed audit receipt. The page verifies the receipt: the Ed25519 signature on the checkpoint and the Merkle inclusion proof. Change one digit of the receipt and verification fails.
What runs for real
The decision path uses the published @glinr/theauth code: createTheAuth, guardTool, tainted, the policy engine, createCheckpoint, createReceipt and verifyReceipt.
Copy the code
The Copy code button emits a guardTool snippet for the scenario and policy you picked. See Guard agent tools and Taint guard for the API, and Audit checkpoints for receipts.
Limits
- The app edge code points
sql.js at its bundled .wasm file. It replaces server-only drivers (mail, Postgres, MySQL, zlib) with empty modules. Those paths are never called.
Last modified on October 17, 2026