Versioned documents. Hierarchical trees. Multi-tenant isolation. All in one API. Share it with your team and your AI agents — open to every agent, private to yours.
// npm install @usewren/client import { WrenClient } from "@usewren/client"; const wren = new WrenClient({ baseUrl: "https://…", apiKey: "wren_…" }); // 1. Documents — create in a collection const doc = await wren.documents.create("events", { name: "Masters 2026" }); // 2. Versions — every update creates a new one await wren.documents.update("events", doc.id, { name: "Masters 2026", champion: "Scheffler" }); await wren.labels.set("events", doc.id, "published"); // 3. Trees — attach to any path, fetch the whole branch in one call await wren.trees.set("site", "/2026/masters", doc.id); const bundle = await wren.trees.getFull("site", { label: "published" });
Features
Three primitives that compose. Pick the ones you need — they all come together.
POST any JSON object into a collection. Attach a JSON Schema later if you want validation. Bring binary assets along for the ride.
Every mutation creates a new version. Roll back, diff, or time-travel to any point. No extra setup.
Pin any version as published, draft, or staging. Serve different audiences from the same document.
Organize documents into named paths. Fetch whole subtrees with ?full=true. Make a tree public with one rule — only its published versions.
Filter, project, and aggregate across documents. Return only the fields you need. Materialized queries auto-refresh on write.
Drop <script src="/wren.js"> into any HTML page. Web components like <wren-list> bind your data declaratively — no framework needed.
A built-in MCP server and llms.txt. Agents read your public data with no key and work in your private data as you — every write reversible. How it works →
wren deploy to a preview, check it, then promote the whole site in one transaction. Roll back the same way.
Invite people by email straight into groups like Editors or Viewers. Admins can view the org as a member to help — and every change made that way is recorded as such.
AI agents
One server, one MCP endpoint. What you publish, anyone’s agent can find and use. What you keep private, only your agents reach — with your permissions, and nothing they do is permanent.
Any agent can connect to /mcp without signing up, see who publishes what, and read published sites and collections. Always the released version, never your drafts.
“Sign in with WREN” from Claude, Cursor or VS Code, pick the org, and the agent works with your groups’ access. Or give it an API key. Revoke either at any time.
Agent writes land as new versions labeled preview. Review the diff, promote what’s good, roll back what isn’t. Nothing is overwritten.
# Read anyone’s public data — no account needed claude mcp add --transport http wren-public https://wren.aemwip.com/mcp # Work in your own org — opens a browser to sign in and choose the org claude mcp add --transport http wren https://wren.aemwip.com/mcp/login
How it works
Each one is useful on its own — together they replace a week of plumbing.
POST any JSON object. Schema-free by default, or attach a JSON Schema when you’re ready to lock it down. Binary uploads are first-class.
Every write creates a version. Diff, roll back, or pin a label to serve a specific snapshot to your clients.
Organize documents into a named hierarchy. Fetch a single path, bundle a subtree, or expose the whole thing as public URLs.
API Reference
The full API is documented at /docs. Here’s the shape of it.
# Create a document curl -X POST /api/v1/events \ -d '{"name": "Masters 2026"}' # Update (creates version 2) curl -X PUT /api/v1/events/abc \ -d '{"name": "Masters 2026", "champion": "Scheffler"}' # Pin a label curl -X POST /api/v1/events/abc/labels \ -d '{"label": "published"}' # Attach to a tree path curl -X PUT /api/v1/tree/site/2026/masters \ -d '{"documentId": "abc"}' # Bundle the published snapshot of the whole site tree curl /api/v1/tree/site?full=true&label=published
Client Libraries
Documents, versions, labels, trees. Full types. Zero extra dependencies. Works in Node, Bun, and async Python.
npm install @usewren/client
import { WrenClient } from "@usewren/client"; const wren = new WrenClient({ baseUrl, apiKey }); // Documents const doc = await wren.documents.create("events", data); // Versions & labels const hist = await wren.versions.list("events", doc.id); await wren.labels.set("events", doc.id, "published"); // Trees await wren.trees.set("site", "/2026/masters", doc.id); const bundle = await wren.trees.getFull("site");
pip install usewren-client
from wren import WrenClient, AsyncWrenClient # Sync — documents, versions, trees with WrenClient(base_url, api_key=key) as wren: doc = wren.documents.create("events", data) wren.labels.set("events", doc.id, "published") wren.trees.set("site", "/2026/masters", doc.id) # Async async with AsyncWrenClient(base_url, api_key=key) as wren: bundle = await wren.trees.get_full("site")
Pricing
Every plan includes the full API, Admin UI, versioning, labels, trees, and binary assets.
For personal projects and experiments.
For side projects and small teams.
For production workloads and compliance.