Lakefront
An HTAP engine on DuckLake for point writes and analytical queries, without a separate ETL pipeline.
Lakefront property for your lakehouse.
Lakefront is an HTAP (hybrid transactional/analytical processing) engine for TypeScript on Bun. Writes commit to a Postgres WAL; DuckDB replicas serve SQL queries, and a background flusher moves committed records into DuckLake. A board is a user-defined table, created on its first write or declared up front.
Point writes and analytical queries run in one system without a separate ETL pipeline. The performance page compares transactional throughput and latency with Postgres and analytical query times with native DuckDB.
import { open } from "lakefront";
await using engine = await open({
postgres: "postgres://lakefront:lakefront@127.0.0.1:5432/lakefront",
data: "./data",
});
await engine.insert("tasks", { id: "t1", title: "Ship it", status: "open" });
const read = await engine.query("tasks", "SELECT id, title FROM {{table}}");
The primitives
These five terms describe how data is written, queried, and tracked.
| Primitive | What it is |
|---|---|
| Board | A user-defined table, created on first write or declared with createBoard. Columns are inferred from data or declared up front. The unit of caching, routing, and isolation. |
| Watermark | A monotonic position in a board’s history. Every write returns the watermark it committed at; hand it back to a read and the read is at least that fresh. See consistency. |
| Write path | Where a write is durable when it acks. The default ("wal") commits to a write-ahead log in the catalog Postgres. See write paths. |
| Replica | A per-board DuckDB file that serves reads, synced to the write history before each query. A cache, never truth: delete it and it rebuilds. See replicas. |
| Watch | The change feed as an async iterable: replay from a watermark, then follow live. The same surface embedded and over HTTP. See watch. |
Where to go
Quickstart
Install, start the catalog, write and read your first board.
Tutorial
Schema evolution, transactions, watch, and the HTTP client.
Concepts
Write paths, consistency, routing, and the design decisions behind them.
Reference
Exact APIs: OpenOptions, the wire protocol, environment variables, errors.
When it fits
- Many small, dynamic tables. A board per tenant, team, or project, each taking point writes and serving aggregate queries.
- Analytics on recent writes. Reads run SQL on a replica synced before every query. Pass a write’s watermark to require that the query sees it.
- No separate ETL pipeline. The engine propagates committed writes to its query replicas and lake storage.
When it does not
- One enormous table. Nothing here shards a single huge table; the unit of everything is the board.
- Write-heavy concurrent OLTP. Postgres had higher write throughput in the published benchmarks.
- A drop-in Postgres replacement. No cross-board joins in the lake, no full SQL on the write path, no wire compatibility.
- Node runtimes. The package ships TypeScript source and requires Bun 1.2 or later.
Lakefront is pre-1.0. The wire format, the OpenOptions surface, and the write-path contract can still change between versions without a deprecation cycle.