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" });
Features
Built for developers who want a real backend without the operational overhead.
Every mutation creates a new version. Roll back, diff, or time-travel to any point. No extra setup.
Each org gets its own Postgres schema. Isolation is structural — not a policy to misconfigure.
Pin any version as published, draft, or staging. Serve different audiences from the same document.
Simple REST, JSON in and out. Safe for AI agents to write — every action is reversible.
Start free on our cloud, or deploy to your own infrastructure with Docker. Bring your own Postgres. No vendor lock-in.
All responses stream from Postgres to the client. Flat memory, no buffering regardless of result size.
How it works
No schemas to define, no migrations to run. Just POST JSON and go.
Collections are schema-free by default. POST any JSON document and it’s stored with version 1.
Every PUT creates a new version. The old data is never overwritten.
List versions, diff any two, label a snapshot, or roll back — all via REST.
API Reference
The full API is documented at /docs. Here’s the shape of it.
# 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
Client Libraries
Full types. Zero extra dependencies. Works in Node, Bun, and async Python.
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");
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)
Pricing
Every plan includes the full API, Admin UI, versioning, labels, and binary assets.
For personal projects and experiments.
For side projects and small teams.
For production workloads and compliance.