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.
In progress
13Scheduled 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 migration1 / 1 done
#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 blocks0 / 3 done
#244schema-language ergonomics — canonical formatter + field directive blocks
0 / 3 done
#227string allocation across the generated read path, write path, and wire boundary9 / 10 done
#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
#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
Planned
12Committed, but not yet scheduled to a version.
Labs
4Experiments and RFCs — spikes to measure before they become features. Not commitments.
Ideas
43Speculative and unscheduled — directions we're considering, pending design.
Shipped
#332generated-code placement — build cache dir, integration modes, and workspace membership10 / 10 done
#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 keys5 / 5 done
#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
#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 behavior24 / 24 done
#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
v0.5.0
August 26, 2026
109 issues
v0.4.1
August 13, 2026
3 issues
v0.4.0
August 12, 2026
36 issues
v0.3.2
August 6, 2026
1 issue
v0.3.1
August 1, 2026
2 issues
v0.3.0
July 31, 2026
12 issues
v0.2.1
July 30, 2026
2 issues
v0.2.0
July 28, 2026
104 issues
Full per-release detail is on the changelog.