Now available · Cloud or self-hosted

Versioned tree storage for hierarchical data.

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

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

Organise 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 any tree and every path is instantly public at /orgs/{slug}/tree/…. Zero client config.

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

Serve a specific label across every document in a tree with one query param. ?label=published gives you a consistent snapshot.

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