Status: what works today
Eelgrass is pre-alpha. This page is the honesty contract: if a capability isn't listed as Yes here, other pages should not imply it ships.
Engine
| Capability | Status |
|---|---|
| Durable on-disk pages + WAL | Yes |
| Crash recovery (WAL replay) | Yes |
| Multi-page B+tree (splits, interiors, root growth) | Yes |
insert / update / delete (tombstones) | Yes |
filter / select | Yes |
sort / take / skip | Yes (stable sort; Int counts) |
join | Yes: follows a ref field (inner) |
group … aggregate | Yes: count / sum / min / max / avg |
distinct | Yes |
asof | Yes: pins nearest named snapshot ≤ time (not raw page history) |
atomic { … } | Yes: SI pin, RYW, single-process first-committer-wins. Transactions |
| ULID row ids | Yes |
Secondary indexes (field: Type @index) | Yes: equality; planner picks index vs scan |
| Access planner (index vs scan hint) | Yes: shape-only hint[^plan] |
| Multi-tenant catalog / fork / snapshot / suspend / delete | Yes |
| Compact (v1) | Yes: eelgrass compact / Studio ops |
| Lazy migration Slice A | Yes: fingerprint apply-on-touch; pending_migration clears |
| Page corruption surfaced (checksum) | Yes: recorded and exposed on GET …/health/detail |
| Cross-process first-committer-wins | Not yet |
across tenants(…) execution | Not yet (parsed only) |
| Cloud backends (R2 / Durable Objects) | Not yet |
Language front-end
| Capability | Status |
|---|---|
| Lexer / parser / AST | Yes |
Typechecker (Money, enums, joins-as-types, is / as) | Yes |
Named queries (query Name(params) { … }) | Yes |
Wasm intel for Studio (complete / diagnose / hover) | Yes |
| Packaged LSP server | Not yet (design only) |
TypeScript (@eelgrass/client)
| Capability | Status |
|---|---|
Money class (bigint minors) | Yes |
eelgrass\…`` tagged template | Yes |
Named-query codegen (eelgrass-codegen) | Yes |
EelgrassExecutor interface | Yes |
| Shipping HTTP / IPC transport | Not yet |
Studio
| Capability | Status |
|---|---|
| Collections + virtualized grid | Yes |
| Query editor + Run | Yes |
Editor intel (| stage menu, completions, hover, Shape + long-press, squiggles) | Yes |
| Write-mode mutation console | Yes |
| Plan hint (index vs scan) | Yes |
| Tenant switcher / create / fork | Yes |
| Time-travel pin (named snapshots) | Yes |
| Schema & migration panel | Yes |
Live CDC (WebSocket /tail + HTTP poll fallback) | Yes |
| Health panel | Yes |
| Mobile-first shell (Studio) | Yes: drawer nav, header ⋮ overflow, bottom-sheet log, safe-area |
| Visual query builder | Yes: stage cards (filter/join/sort/asof/group/… + CRUD); compound/atomic stay in Code |
Local playground (?local=1) | Yes: part-based app builder on D17 wasm (localEngine); mock only as fallback/?mock=1; templates + workspace ledger + live .eel |
| 100k-row grid tripwire | Yes: ?bench=grid100k Playwright scroll budget |
| Playground mobile Playwright | Yes on apex (playground-e2e / npm run test:playground:ci); PR gate still rust+docs only |
| Playground workbook export package | Yes: JSON package { schema.eel, queries.eel, project.json, data.json }; zip / serve handoff polish later |
Browser engine
| Capability | Status |
|---|---|
| File + in-memory storage backends[^traits] | Yes |
| Injected wall clock | Yes |
| Wasm session engine | Yes |
| Durable OPFS engine | Yes: Web Worker + createSyncAccessHandle (synchronous, crash-consistent) |
What's next
@breakingdrop + page-history compaction (lazy migration Slice B+)asofover raw page-version history- OPFS log-structured store (flush is O(delta), not O(mirror))
- Cross-process conflict detection
- TS transport + export/import packaging
- Execute
across tenantsunder capability grants
Agent plans and crate-level design live under Maintainers → Internals. Those are not product promises.
[^plan]: Implemented in the eelgrass-plan crate for maintainers who are tracing the workspace. [^traits]: Storage and recovery are pluggable behind PageStore / WalSink traits (file and mem backends). Product users only need to know that disk and browser share the same execution model.