What changed, written for users rather than as a commit log. For where the project is going next, see the roadmap.
2026-07-13 — the application pass
A pass that fills in the everyday MongoDB-style application surface — immediate updates, bulk writes, transactions, and real collection/index lifecycle — across the CLI, MCP, the driver protocol, and both language clients.
- Immediate updates:
update-one,update-many,find-one-and-update(with before/after images), anddelete-manyapply update operators atomically and fail-closed — a many-document update commits its complete selected set or appends nothing. Every command carries explicit scan/mutation bounds; exceeding one is an error, never a partial answer. - Explicit-seed upsert: when nothing matches,
update-oneinserts a document you supply — OMGDB never synthesizes a document from the filter. - Ordered bulk writes:
bulk-writeruns a versioned program of up to 1,024 CRUD operations as one atomic transaction, where later steps read earlier writes. - One-request transactions: the driver and the TypeScript/Python clients expose an ordered
insert/get/replace/deleteprogram executed with read-your-writes visibility and committed as onebegin/commitframe with one fsync — no cross-request transaction tokens, no held locks. Before executing, a transaction authorizes itself by replaying the canonical op-log, never by trusting derived cache files. - Collection lifecycle:
create-collection(empty collections are first-class),list-collections, anddrop-collectionare authoritative op-log operations. - Named indexes: indexes now have stable, collection-scoped names —
create-index --name,list-indexes,drop-index; legacy nameless definitions derive a deterministic identity, and checked-in legacy-log fixtures pin the cross-version behavior. count-documentsanddistinct: planner-driven counting and deterministic distinct values, bounded and order-stable.- MCP: the server now exposes 48 tools, and the
dangerousscope became real —drop_collectionis never advertised or callable below it. - In the playground:
update-oneand an orderedbulk-writeprogram run live in your browser on the real engine.
Stated plainly: transactions and DDL pay a synchronous canonical-replay preflight (bounded, correctness-first) until paged state lands, and upserts are explicit-seed only by design.
2026-07-11 — the native-search pass
A pass that gives the engine a real retrieval stack — full-text, semantic, and hybrid — without giving up the text-canonical design.
- Full-text search:
define-search-indexwrites a versioned, typed index definition into the op-log, where it is replayed, transacted, and compacted like any other operation. Queries are a strict AST — term, phrase, prefix, fuzzy, regex, boolean — with no query-string dialect to escape. - Deterministic BM25: per-field weights, versioned English/Greek/keyword/n-gram analyzers, bounded UTF-8-safe highlighted snippets, and
--explainscore breakdowns with stable semantics versions. Scores are identical on every platform, browser included. - Structured + text in one call:
search --filterintersects a MongoDB-style filter with the text query before ranking, at one consistent log boundary, and re-checks every hit against canonical live-document state. - Semantic and hybrid modes: exact-cosine ranking over locally computed embeddings, and versioned deterministic reciprocal-rank fusion of the lexical and semantic rankings.
- Pinned local models:
omgdb models pullinstallsbge-small-en-v1.5ormultilingual-e5-smallwith revision, size, SHA-256, tokenizer, and license verification — the only network path in the engine. Search never downloads; builds without model support report the capability as unavailable. - Honest derived generations: the accelerated index records definition/analyzer digests, its exact log boundary, file checksums, and rebuild reason.
search-index-statusreports them; a missing, stale, corrupt, swapped, or partial generation is rebuilt, never served. - In the playground: the full lexical lifecycle — define, search, fuzzy, filter intersection, status — runs live in your browser on the real engine.
Current limits, stated plainly: search opens the full in-memory store, rebuilds are synchronous and whole-index (no incremental tail indexing yet), semantic mode exact-scores every filtered chunk, and model inference requires a supported native build.
2026-07-02 — the performance pass
A pass focused on making writes fast without giving up the text-canonical design, and on tightening the agent contract.
- Bulk import:
import-jsonlloads 50,000 documents in about 2 seconds, committing atomic batches with one fsync each. - Single writes: durable single-document writes are now fsync-bound — the same physical wall every embedded database hits — instead of paying a cache rewrite per operation. Derived cache checkpoints persist on a bounded-lag policy and heal lazily on read.
describeshows the write contract: the live manual now includes each collection’s indexes and validation rules alongside the inferred schema and samples.- Vectors:
vsyncis incremental (fresh embeddings are skipped), andvsearch/contextreuse persisted vectors instead of re-embedding per call. - Query planning:
$innow plans as a union of index buckets instead of falling back to a scan, and two-sided ranges scan the more selective bound. - MCP contract fixes: unknown tool names report “unknown tool”, destructive tools carry real destructive hints, and per-tool required parameters — including
vsearch’sk/filterandcontext_pack’sbudget/filter— are declared in the schema. - Structured errors:
explainanddiagnosefail loudly on a missing collection with a did-you-mean hint;findkeeps empty-result semantics but warns on stderr. - Compaction honesty: compacting the op-log preserves each surviving record’s original timestamp.
- Regression gate: the production benchmark harness now doubles as a coarse regression gate, so a reintroduced hot-path cost fails loudly in CI-adjacent runs.
The full engineering story of this pass — how a text-log database got its writes back — is in the blog post 63x faster inserts.
2026-06 — the hardening pass
A pass focused on durability and recovery guarantees.
- Crash-truncation test matrix: the log is truncated at every plausible byte boundary in tests, including non-UTF-8 tears, and recovery must hold at each one.
- Canonical codec property test: the codec is bit-exact —
dump → load → dumpis byte-identical, enforced by a property test rather than a handful of examples. repairtool: an opt-in recovery command that reports a corrupt log’s intact prefix and truncates to it only with explicit confirmation, backing up the original first.- Cross-platform CI: Linux, Windows, and macOS, plus a pinned minimum supported Rust version.