Roadmap

Where the ForgeDB core is headed — initiatives grouped under their epic, with standalone fixes alongside. What's in progress, planned, experimental, and still an idea.

Snapshot as of August 28, 2026, built from live GitHub issues, milestones, and epic sub-issues. For the moment-to-moment view, see the ForgeDB Roadmap project.
Latestv0.5.0· Nextv0.6.02 done · 46 openChangelog →

In progress

13

Scheduled to a release or actively in flight. Epics show per-child progress; done-but-untagged work lands on the changelog when its release is cut.

#253v1 breaking changes — staged notes for work that requires a migration
1 / 1 done
  • #254timestamp(<precision>): declarable precision, millisecond default, and +timestamp identitiesv0.4.0
#244schema-language ergonomics — canonical formatter + field directive blocks
0 / 3 done
  • #247Reconcile both TextMate grammars with field directive blocks (#246)
  • #246RFC: field directive blocks — `name: string { @a @b }` for multi-directive fieldsv0.6.0
  • #245RFC: `forgedb fmt` — comment-preserving trivia, canonical alignment, and an LSP formatting providerv0.6.0
#227string allocation across the generated read path, write path, and wire boundary
9 / 10 done
  • #256RFC: Allocation-free index keys — typed keys for fixed-size types, seeded 128-bit hashed keys for variable-size (follow-on to #230)v0.6.0
  • #240Bound-driven elision: delete the tag, the overflow branch, and the data file when a bound proves the worst case fitsv0.4.0
  • #238string(N): fixed-width inline string columns, one byte per character by defaultv0.4.0
  • #232Inline-or-overflow string columns: hold short strings in the 16-byte slot that already exists
  • #231Nullable strings allocate a tagged copy before appendv0.4.0
  • #230Index keys are built through serde_json::Value for types known at generate timev0.4.0
  • #229List response allocates every page string twice (json! builds a Value tree)v0.4.0
  • #228Never materialize a scan row: sort and paginate inside the scan scopev0.4.0
  • #226Serialize the list page from buffered columns instead of per-row `get(id)`v0.4.0
  • #224RFC: Zero-copy borrowed string reads — additive `read_str` + a consumer that skips per-field `String` materializationv0.4.0
#152performance triage (ranked sweep of the generated hot paths + substrate)
11 / 15 done
  • #171[perf] Vectorized aggregate fold over buffered columns (scan_aggregate residual)v0.6.0
  • #165[perf] Sweep + replace wasteful internal JSON encoding with a binary codecv0.6.0
  • #164[perf] Coordinator RPC uses JSON per turn + clones key-set on retry (Low)v0.6.0
  • #163[perf] Durable-log catch-up front-scan + unbounded conflict map (Medium)v0.6.0
  • #222[perf] VariableColumn::gather_buffered reads the whole data region on every scan (slope in amplification)v0.3.1
  • #221[perf] Scan cliff: FixedColumn::gather does one syscall per row once the dense-prefix fast path is lost (56-137x)v0.3.1
  • #162[perf] Auto-compaction runs inline on the write path (full rewrite + reopen) (Medium)v0.2.0
  • #161[perf] Reopen/peer-refresh rehydrate is O(rows × indexes) + full WAL read (Medium)v0.2.0
  • #159[perf] Snapshot ?as_of reads are O(rows) id-scans; FK-probe quadratic (High)v0.2.0
  • #158[perf] reader() deep-clones all index maps O(rows) per call (High)v0.2.0
  • #157[perf] Record serialized to JSON twice per write (High)v0.2.0
  • #156[perf] Coordinator holds the commit turn across broker fsync (High)v0.2.0
  • #155[perf] M2M cascade-unlink is O(link_rows²) (High)v0.2.0
  • #154[perf] M2M traversal is a full latest-wins junction scan per lookup (High)v0.2.0
  • #153[perf] Buffered column I/O + single checkpoint barrier (Critical)v0.2.0
#47@computed convention (two-tier: handler #87 + expression #88) + wire validate --implementations
0 / 2 done
  • #88@computed Tier 1: expression getter (@computed(expr) → generated body)v0.7.0
  • #87@computed Tier 2: handler trait (bare @computed → generated <Model>Computed trait)v0.7.0

Planned

12

Committed, but not yet scheduled to a version.

Labs

4

Experiments and RFCs — spikes to measure before they become features. Not commitments.

Ideas

43

Speculative and unscheduled — directions we're considering, pending design.

Shipped

#332generated-code placement — build cache dir, integration modes, and workspace membership
10 / 10 done
  • #374Migrations must not require writing Rust: capture the answer at create-time, shrink the provable set, and escape to the author's own runtimev0.5.0
  • #361forgedb build reads two different config files and ignores --config for the [runtime]/[storage] knobsv0.5.0
  • #339CI: run the reclose under a parent workspace with a cold cache, and delete the harness [workspace] workaroundsv0.5.0
  • #338Rust in-tree: emit a ForgeDB-owned cargo package into the consumer's tree, and print the one line that links itv0.5.0
  • #337Artifact delivery: source fingerprinting, load-time verification, and per-target destinationsv0.5.0
  • #336Gate the web/API layer and utoipa to standalone-process modev0.5.0
  • #335ForgeDB owns the build: split generate from build, and drop maturin/napi-cli for cargo plus generated shimsv0.5.0
  • #334The build cache dir: a ForgeDB-owned workspace root with per-app membersv0.5.0
  • #333Project identity and grouping: read [project].name, add an isolated flag, and resolve the enclosing projectv0.5.0
  • #328Generated transformer/engine Cargo.toml has no [workspace] table, so an app inside a cargo workspace cannot build itv0.5.0
#255identity fields — existence, type constraints, and non-UUID keys
5 / 5 done
  • #266Foreign keys follow the target's identity type (supersedes #265)v0.4.0
  • #265A foreign key to a non-UUID-keyed model generates a Uuid column that can never match the target's idv0.4.0
  • #252String identity fields: `string(N)` / `string(N!)` keys backed by a `Copy` `InlineStr` substrate typev0.4.0
  • #251Identity field type is unconstrained: string and timestamp identities generate uncompilable codev0.4.0
  • #248An id-less model generates code that does not compile (4 paths assume an identity field)v0.4.0
#167Storage-model experiment — append-only vs in-place, measured (Phase 1 confound fixes first)
6 / 7 done
  • #218[perf,experiment] P2-0: churn scenario — price the append-only tax directly (no variant)
  • #219[perf,experiment] P2c: versioning-off GenConfig variant — separate the MVCC tax from the append tax
  • #172RFC: Fixed-width in-place storage-model variant (Phase 2 of #167)
  • #170[perf] Group/batch commit — one fsync barrier per N rowsv0.2.0
  • #169[perf] Ordered/range index kind for range + top-N queriesv0.2.0
  • #168[perf] Column-pruned sequential scan path (`__scan`)v0.2.0
  • #160[perf] Wire projection into list/traversal/live-query/reverse-FK (Medium)v0.2.0
#126Configurable runtime behavior
24 / 24 done
  • #151[config] Formalize observability: log level/format + metrics togglev0.3.0
  • #150[config] MAX_CASCADE_DEPTHv0.2.0
  • #149[config] Wasm replica backend force-select (OPFS/IDB)
  • #148[config] Wasm replica commit debounce (250ms / 100 frames)v0.3.0
  • #147[config] Auth defaults (leeway / alg-list / tenant-claim) + fix scaffold single-alg limitv0.3.0
  • #146[config] Transaction max_retries (wire residual [transaction])v0.3.0
  • #145[config] Coordinator MAX_FRAMEv0.3.0
  • #144[config] Coordinator TURN_TIMEOUTv0.3.0
  • #143[config] Coordinator CONNECT_TIMEOUT + IO_TIMEOUTv0.4.0
  • #142[config,server] graceful-shutdown drain timeout (host/port env + dead [api] table already done)v0.3.0
  • #141[config] Pagination MAX_LIMIT / DEFAULT_LIMITv0.3.0
  • #139[config] WS-frame/message-size limit (currently absent)v0.4.0
  • #138[config] Request-body-size limit (currently absent)v0.4.0
  • #137[config] Durable-log retention / prune_through triggerv0.3.0
  • #136[config] Durable broker capacity + _replication.log fsync policyv0.2.0
  • #135[config] In-process changefeed broadcast capacityv0.2.0
  • #134[config] compaction = off (Tier A omit of the auto-trigger)v0.2.0
  • #133[config] Compaction dead-row thresholdv0.2.0
  • #132[config] Transaction-journal fsync policyv0.2.0
  • #131[config] WAL checkpoint intervalv0.2.0
  • #130[config] Replication-broker attach gate — default OFF (fixes double fsync barrier)v0.2.0
  • #129[config] fsync policy knob (Tier A `never` omit + Tier B cadence)v0.2.0
  • #128[config] Remove/reconcile the dead forgedb.toml scaffold configv0.2.0
  • #127[config] forgedb.toml [runtime]/[storage]/[server] surface + generate-time plumbingv0.2.0

Full per-release detail is on the changelog.

Search documentation

Find pages across the ForgeDB docs