Skip to content
lanck

Your application runs as .wasm. Inside the database.

Planck is a document database with a WASM runtime built in. Your handlers query the store through a typed builder, in the same process, no socket, no ORM. Deploy is one binary uploaded with one command.

What's in the box.

Storage engine, WASM runtime, HTTP server, change streams, replication, plus a workbench control plane that drives backups, GC, and the rest. Nothing to glue.

Document store

LSM-shaped: skiplist memtable, WAL append, value log, B+tree primary index, secondary indexes. BSON documents, u128 keys.

WASM runtime in-process

Your service compiles to one .wasm. Planck loads it next to the store. Reads and writes are function calls, not network round-trips.

PQL query language

Method-chain: store.filter(...).orderBy(...).limit(N). Range scans, aggregates, projections, get-by-key. No ORM.

You pick the wire

Render HTML fragments for HTMX / Alpine / Datastar, return JSON for an API, or stream bytes. The same handler decides per route.

Change streams

Subscribe to store mutations from inside a service or over the wire. Watch a single key, a range, or a whole store. Filterable, observable.

Replication + WAL streaming

Primary ships WAL frames to a read-only replica asynchronously. Rotated WAL segments can also stream to an archive path for offsite retention.

Scheduler

Cron-style tasks for backup, GC, WAL truncate, stats snapshot, export, import. Per-app or per-service. Editable from the workbench.

Live UIs over SSE

An optional SSE service subscribes to change streams and fans events out to browser EventSource clients. Hypermedia front-ends update without polling.

Workbench UI

Browser control plane on :2369. Deploy, run PQL, edit schedules, view logs, manage backups, watch the store. Everything operations cares about.

One process. Five layers.

The database, the HTTP server, the WASM runtime, the template engine, and your handlers, all in the same process.

Pick the architecture that fits your team.

Same primitives, three architecture styles. Planck supports all three.

A
Recommended for new systems

Service per domain

One planck instance per bounded context: orders, products, billing. Each owns its data, its handlers, its UI fragments. Cross-context work via change streams or direct calls.

orders.wasm + store
products.wasm + store
billing.wasm + store
B
Familiar mental model

Monolith

One planck instance, one .wasm, handlers across every domain. The classic monolith: compiled, sandboxed, deployed in one step. Stores share an instance but stay independent at the schema level.

app.wasm, all routes
orders store
products store
billing store
C
Drop-in for classic APIs

Microservices

Same pattern as A, but handlers return JSON instead of HTML fragments. Everything still runs as WASM inside planck. The only difference is the wire format your clients consume.

orders.wasm → JSON
products.wasm → JSON
billing.wasm → JSON

A and B are both Self-Contained Systems: many vertical slices versus one. C is the classic API-services style, where the UI lives outside the service boundary. Planck supports all three from the same primitives.