Now available · Cloud or self-hosted

Three things you’ll never have to build again.

Versioned documents. Hierarchical trees. Multi-tenant isolation. All in one API. Cloud hosted or deploy to your own infrastructure.

// npm install @wren/client
import { WrenClient } from "@wren/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" });

Collections, versions, trees.

Three primitives that compose. Pick the ones you need — they all come together.

Schema-free documents

POST any JSON object into a collection. Attach a JSON Schema later if you want validation. Bring binary assets along for the ride.

Versioned by default

Every mutation creates a new version. Roll back, diff, or time-travel to any point. No extra setup.

Label snapshots

Pin any version as published, draft, or staging. Serve different audiences from the same document.

Trees bundle hierarchy

Organise documents into named paths. Fetch whole subtrees with ?full=true. Public read URLs with zero config.

Tenant isolation

Each org gets its own Postgres schema. Isolation is structural — not a policy to misconfigure.

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.

Three primitives. One API.

Each one is useful on its own — together they replace a week of plumbing.

1

Collections hold your data

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.

2

Versions remember everything

Every write creates a version. Diff, roll back, or pin a label to serve a specific snapshot to your clients.

3

Trees give you structure

Organise documents into a named hierarchy. Fetch a single path, bundle a subtree, or expose the whole thing as public URLs.

A handful of endpoints. Documents, versions, trees.

The full API is documented at /docs. Here’s the shape of it.

bash
# 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

First-class TypeScript & Python clients.

Documents, versions, labels, trees. Full types. Zero extra dependencies. Works in Node, Bun, and async Python.

TypeScript & JavaScript npm install @wren/client
import { WrenClient } from "@wren/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");
Python pip install wren-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")

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 organisation
  • 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 organisations
  • Unlimited collections
  • Unlimited documents
  • Unlimited storage
  • Unlimited API requests
  • Unlimited collaborators
  • SSO & audit logging
  • Self-hosted or managed
  • Dedicated support & SLA
Contact us