Now available · Cloud or self-hosted

Versioned JSON storage for your apps.

Every write creates a version. Security and multi-tenancy built in. Use our cloud or deploy to your own infrastructure.

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

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

// Create a document (version 1)
const doc = await wren.documents.create("pages", { title: "Hello", body: "World" });

// Update (version 2 created automatically)
await wren.documents.update("pages", doc.id, { title: "Hello v2" });

// Pin a label and read it back
await wren.labels.set("pages", doc.id, "published");
const live = await wren.documents.get("pages", doc.id, { label: "published" });

Everything you need, nothing you don’t.

Built for developers who want a real backend without the operational overhead.

Versioned by default

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

Tenant isolation

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

Label snapshots

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

LLM-friendly

Simple REST, JSON in and out. Safe for AI agents to write — every action is reversible.

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.

Streamed responses

All responses stream from Postgres to the client. Flat memory, no buffering regardless of result size.

Simple by design.

No schemas to define, no migrations to run. Just POST JSON and go.

1

Define nothing

Collections are schema-free by default. POST any JSON document and it’s stored with version 1.

2

Mutate freely

Every PUT creates a new version. The old data is never overwritten.

3

Access history

List versions, diff any two, label a snapshot, or roll back — all via REST.

A handful of endpoints. Infinite history.

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

bash
# Create a document
curl -X POST /pages \
  -d '{"title": "My Page", "published": false}'

# Update (creates version 2)
curl -X PUT /pages/{id} \
  -d '{"title": "My Page", "published": true}'

# Diff v1 → v2
curl /pages/{id}/diff?v1=1&v2=2

# Rollback to v1
curl -X POST /pages/{id}/rollback/1

First-class TypeScript & Python clients.

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, versions, labels, trees…
const doc  = await wren.documents.create("pages", data);
const hist = await wren.versions.list("pages", doc.id);
const diff = await wren.diff.compare("pages", doc.id, 1, 2);
await wren.labels.set("pages", doc.id, "published");
Python pip install wren-client
from wren import WrenClient, AsyncWrenClient

# Sync
with WrenClient(base_url, api_key=key) as wren:
    doc  = wren.documents.create("pages", data)
    hist = wren.versions.list("pages", doc.id)
    wren.labels.set("pages", doc.id, "published")

# Async
async with AsyncWrenClient(base_url, api_key=key) as wren:
    doc = await wren.documents.create("pages", data)

Start free. Scale when you’re ready.

Every plan includes the full API, Admin UI, versioning, labels, 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