Skip to content

What is Eelgrass?

Eelgrass is a multi-tenant-by-default database engine and query language, built clean-room in Rust.

Most databases were designed single-tenant. Multi-tenancy got bolted on later with tenant_id columns or fleets of orchestrated databases. In Eelgrass the tenant is a primitive of storage, language, and types. Queries are tenant-scoped by default. Cross-tenant work uses CDC and app-layer sagas.

That design is the shift-left bet: isolation, audit history, lazy migration, forks, and change feeds leave the business layer and become engine work. Builder summary: Shift left. Business framing: Business & sales.

Founding bets

  1. Tenant = consistency boundary. Transactions, snapshots, forks, and residency are tenant-scoped engine operations. No cross-tenant transactions. Cross-tenant coordination is CDC + sagas.
  2. Storage stores values. It does not enforce types or foreign keys at write time. Meaning lives in the language layer.
  3. Types are a language-layer construct. Schemas are code: diffable, versioned, CI-checked. Drift surfaces as unknown, never silent coercion.
  4. No hand-written migration files. Edit the schema; fingerprints drive lazy apply-on-touch. Destructive changes require @breaking.
  5. Editor-first language. Pipe-based queries where every stage has a known shape. Autocomplete and inline errors are design inputs.
  6. Versioned immutable pages. Copy-on-write forks, named snapshots, and lazy migration fall out of one storage decision.

Surfaces that ship today

SurfaceRole
CLI (eelgrass)Local DB: run, serve, studio, compact, typecheck helpers
StudioLocal web UI over eelgrass serve
Playground (?local=1 / play.eelgrass.dev)In-tab wasm engine (OPFS or memory)
@eelgrass/clientMoney types, tagged template, named-query codegen

Honest maturity

Eelgrass is pre-alpha. Status is the capability inventory. Everything else on this site describes what the code does now, with limits called out inline.

Pre-alpha. Local-first. Stdlib-only Rust engine. Tenant concerns shifted left into the database.