Current: v0.5.0

Changelog

What changed in each release of Twill DB, newest first — written to be read, not just diffed. Every version ships the whole workspace in lockstep, so the wrapper and the native binary it loads are always an ABI-matched pair. For the roadmap and spec status, see Release.

Pre-1.0 — read before upgrading

Twill DB is 0.x: interfaces, the SQL surface, and on-disk/storage formats may change between releases, and backward compatibility is not guaranteed until 1.0.0. Pin an exact version. Versions track the Cargo workspace version; the three distribution channels (npm, GitHub Releases, GHCR) all ship at the same tag.

Release

v0.5.0 — SQL completeness, row-level security & tooling ✓ current

The biggest feature release so far, and an entirely additive one. The query frontend grows to cover the SQL most applications actually write (Phase 6), row-level security lands inside the engine (Phase 7), Node and PHP join Bun as embedded clients, and Twill DB gains real command-line tooling — a project scaffolder and a full database-management CLI. Because the storage seam never moved — ENGINE_ABI_VERSION stays 3, STORAGE_TRAIT_VERSION stays 3 — every one of these features branches, scales to zero, and restores point-in-time for free.

A much larger SQL surface (Phase 6)

The hand-written frontend grows in two stages without touching the seam. 6A fills in expression-level and single-table SQL — CASE, CAST/::, IN/BETWEEN, string concatenation with ||, NULLS FIRST/LAST, RETURNING, upserts via ON CONFLICT, and INSERT … SELECT. 6B moves to multi-table work: views, joins, qualified names, DISTINCT, set operations, derived tables/CTEs, correlated and non-correlated subqueries, join-driven DML, and grouped aggregation. Together they take the engine from a deliberately narrow subset to something that runs the queries an everyday app issues; anything still unsupported returns a clean ENGINE_ERR_SQL rather than mis-parsing.

Row-Level Security, built in (Phase 7)

RLS is now enforced inside the engine, over the same MVCC snapshot every query already passes through. You declare policies with CREATE/DROP POLICY and switch enforcement on with ALTER TABLE … ENABLE ROW LEVEL SECURITY; both are persisted as additive WAL catalog facts, so policies travel with the database and its branches. Each connection carries a session context — a role plus JWT claims, set via SET ROLE and SET twill.jwt.claims — that policy expressions read through auth.uid(), auth.role(), and auth.claim(). Enforcement is default-deny: USING predicates filter reads, WITH CHECK governs writes, RETURNING is filtered to visible rows, and there is an explicit, off-by-default bypass that is never inferred from a role name. Policies reflect through pg_policies. JWT verification and identity stay composed around the engine, so PostgREST-style stacks keep working unchanged.

Command-line tooling

Two CLIs ship. The dependency-free twilldb scaffolder generates a ready-to-run starter app (new/init, including a --vector HNSW template). The database-management CLI (spec 19) adds day-to-day operations — sql, shell, tables, migrate, gen types, seed, stats, branch, db reset, schema dump, and serve — and works both embedded (file:///s3://) and over the wire (postgres://), with the transport chosen by the connection-string scheme.

Node & PHP clients

@twilldb/node (koffi FFI) and twilldb/twilldb (PHP FFI) join the Bun client with the same surface, bringing Twill DB to Node, Next.js, Astro, and Vite on the JavaScript side and to Laravel and CodeIgniter on the PHP side.

Also in this release

Release

v0.4.0 — Distribution & benchmarking ✓ shipped

The release that makes Twill DB installable and measurable: a real distribution story plus the validation tooling to back the performance and correctness claims.

Highlights

Also

Release

v0.3.2 — Durability proof & throughput

Hardening the most important promise — that an acknowledged commit survives a crash — and adding the lever that keeps commits fast.

Release

v0.3.1 — Website, brand & supply chain

Release

v0.3.0 — Branching, lifecycle & vector search

The release that turned an embeddable engine into a serverless platform: instant clones, scale-to-zero, and an in-core vector capability — all additive, because the seam never moved.

Release

v0.2.0 — Foundations: the engine and its two doors

The first published release. It established the whole architecture: one engine, one pluggable seam, two front doors, two backends.

Versioning & compatibility markers

Two internal version numbers track compatibility and appear throughout these notes: ENGINE_ABI_VERSION (the frozen C embedding contract — the Bun wrapper refuses a mismatched binary) and STORAGE_TRAIT_VERSION (the storage seam). They are bumped only on a contract change, and the project's discipline is that growth stays additive so the seam never moves. Current: ABI 3, Trait 3.