Now available · Cloud or self-hosted

Versioned tree storage for hierarchical data.

Organize JSON documents into paths. Bundle whole subtrees with one fetch. Versioning and multi-tenancy built in. Cloud hosted or self-hosted.

// npm install @usewren/client
import { WrenClient } from "@usewren/client";

const wren = new WrenClient({ baseUrl: "https://…", apiKey: "wren_…" });

// Create an event at /events/masters-2026
const event = await wren.documents.create("events", { name: "Masters 2026", city: "Augusta" });
await wren.trees.set("events", "/masters-2026", event.id);

// Fetch the whole events tree in one call
const full = await wren.trees.getFull("events");

// Public read — no auth, just a URL
const pub = await fetch("https://api.example.com/orgs/tkd/tree/events/masters-2026");

Built for hierarchical data.

Trees, paths, and public URLs. Everything you need to store and serve nested JSON.

Paths as structure

Organize documents into named trees. Any hierarchy works: events, categories, org charts, taxonomies — the path is the data shape.

Public read URLs

Grant principal=* read to a tree — optionally only its published versions — and every path is public at /orgs/{slug}/tree/…. Drafts stay private.

Subtree bundling

Append ?full=true to fetch an entire branch with all documents resolved in a single request. Perfect for client-side caching.

Versioned at every node

Each document that lives at a path keeps its own version history. Swap in new versions without touching the tree. Roll back, diff, or time-travel.

Label the whole tree

Read a whole tree at one label with ?label=preview on the private API, then promote it to published in one transaction. A consistent snapshot, every time.

Cloud or self-hosted

Start free on our cloud, or deploy to your own infrastructure with Docker. Bring your own Postgres. No vendor lock-in.

Open to every agent. Private to yours.

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.

Public data, no key

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.

Private data, as you

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

Safe to let it write

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

Set up Claude Code, Cursor or VS Code →

Three steps to a live tree.

From an empty org to a publicly readable hierarchy in a few REST calls.

1

Create a path

PUT to a tree path to create it. Folders can be empty — you can build the shape before the data lands.

2

Attach a document

Pass a documentId to assign a JSON doc at that path. The doc keeps its own version history.

3

Read it back

GET a single node, GET a whole subtree with ?full=true, or expose it publicly and fetch it from any client.

A handful of endpoints. Infinite hierarchy.

The full API is documented at /docs. Here’s the tree API in one glance.

bash
# Assign a document to a path
curl -X PUT /api/v1/tree/events/masters-2026 \
  -d '{"documentId": "abc"}'

# Create an empty folder (no document yet)
curl -X PUT /api/v1/tree/events/2027 -d '{}'

# Read a path with its children
curl /api/v1/tree/events/masters-2026

# Bundle the whole tree at a specific label
curl /api/v1/tree/events?full=true&label=published

# Public read via org slug (no auth header)
curl /orgs/tkd/tree/events/masters-2026

First-class TypeScript & Python clients.

Full tree API. Zero extra dependencies. Works in Node, Bun, and async Python.

TypeScript & JavaScript npm install @usewren/client
import { WrenClient } from "@usewren/client";

const wren = new WrenClient({ baseUrl, apiKey });

// Assign, read, bundle — all strongly typed
await wren.trees.set("events", "/masters-2026", docId);
const node = await wren.trees.get("events", "/masters-2026");
const full = await wren.trees.getFull("events", { label: "published" });
await wren.trees.delete("events", "/masters-2026");
Python pip install usewren-client
from wren import WrenClient, AsyncWrenClient

# Sync
with WrenClient(base_url, api_key=key) as wren:
    wren.trees.set("events", "/masters-2026", doc_id)
    node = wren.trees.get("events", "/masters-2026")
    full = wren.trees.get_full("events", label="published")

# Async
async with AsyncWrenClient(base_url, api_key=key) as wren:
    full = await wren.trees.get_full("events")

Start free. Scale when you’re ready.

Every plan includes the full API, Admin UI, versioning, labels, trees, and binary assets.

Free

$0/month

For personal projects and experiments.

  • 1 organization
  • 3 collections
  • 1 000 documents
  • 100 MB storage
  • 10 000 API requests / day
  • Community support
Get started

Enterprise

Custom

For production workloads and compliance.

  • Unlimited organizations
  • Unlimited collections
  • Unlimited documents
  • Unlimited storage
  • Unlimited API requests
  • Unlimited collaborators
  • SSO & audit logging
  • Self-hosted or managed
  • Dedicated support & SLA
Contact us