Releases
Every HybridDB release — currently v0.8.0: logical-pk vector identity, metadata pre-filtering, chunking, versioned tables, and the write-path tuning story.
[0.8.0] — 2026-09-03
Changed
- Chroma vectors are keyed by the logical primary key (
str(pk)), not the physical rowid — one identity shared across SQLite, the DuckDB mirror, and Chroma. This deletes at the root the bug class behind the TEXT-PK journal wedge (DuplicateIDErroron delete+reinsert) and the repeated rowid→pk mapping bugs from 0.5.4/0.5.5/CoreMem.- Per-collection identity marker (
hybriddb:identity: pk|rowid) in Chroma collection metadata. New collections are pk-keyed from creation; pre-0.8 collections keep rowid keys until migrated — upgrading changes nothing until you opt in. migrate_vector_identity(table=None)re-keys legacy collections by copying embeddings (never recomputed — asserted bit-identical) and deleting orphan rowid-keyed vectors; idempotent; covers all longtext collections.- Read paths unified on pks: FTS keyword ids, vector ids, and
_fetch_rows_by_idsall use the pk;reconcileis scheme-aware. - Regression test: the TEXT-PK delete+reinsert scenario can no longer produce duplicate vector keys.
- Per-collection identity marker (
[0.7.0] — 2026-09-02
Added
- Metadata pre-filtering:
search(..., where={...})pushes scalar-column filters into Chroma before the vector scan (multi-tenant scoping), with equality and Chroma operators ({"$gte": ...}); the Python post-filter still runs on top. - Long-document chunking helper (
hybriddb.chunking.chunk_text): dependency-free deterministic splitter — paragraph boundaries first, then sentences, never mid-sentence; ~1200-char budget ≈ ~300 tokens; optional overlap. Plus the documented chunks-as-rows pattern.
Changed
- DuckDB mirrors are created on first OLAP query instead of at database open — tables you never query with
olapcost nothing to maintain.
Fixed
- Operator-form
where({"score": {"$gte": 50}}) was silently ignored in keyword mode — the post-filter now evaluates the standard operators sowhere=filters identically in all modes.
Performance
- Versioned-table rollback ~20× faster for removal-heavy cases (1,000 rows: 1,980ms → 92ms; ~122ms with Chroma + DuckDB live). Removals are set-based: one transaction, chunked
DELETE … WHERE pk IN (…), hash-chain tombstones viaexecutemany. - Batched restores: update-heavy rollbacks 3,931ms → 107ms at 100k rows via split batched
INSERT/UPDATE(41× the removal path). Chroma re-embedding of restoredLONGTEXTremains by design.
[0.6.0] — 2026-08-26
Added
- Versioned tables — git-like primitives with a tamper-evident hash chain:
versioned=True, hash_chain=True,upsert,log,history,as_of,diff,checkpoint/rollback(append-only — the chain never rewinds),verify_chain,archive(jsonl/parquet),prunewith chain anchors,db.author. - Measured write overhead for versioned tables: ~13% (20.6k → 18.0k rows/s at 100k rows).
- Guardrails: schema changes rejected on versioned tables;
__historynames reserved; history tables excluded fromlist_tables, DuckDB mirroring, and graph sync. - Clear error for
idcolumns lackingPRIMARY KEY. forkis deferred — checkpoint/rollback covers the agent-memory rewind workflow.
[0.5.8] — 2026-08-25
- Packaging fix:
dependencieswere misplaced inpyproject.toml, so published wheels carried no dependency declarations — a freshpip install hybriddbdid not pull in chromadb. Fixed.
[0.5.7] — 2026-08-25
Performance
insert_batch13× faster (1,860 → 24,500 rows/s at 100k rows) — the bottleneck was a fresh SQLite connection per row.insert_batch(sync=True)now actually means synced — large batches previously left the journal backlogged, making every subsequent search silently pay a 35–40s flush.- DuckDB mirror stores
REALasDOUBLE(was float32, silently losing precision — caught by a correctness-checked benchmark).
Added
- BEIR search-accuracy evaluation: graded nDCG/recall/precision/MRR on NFCorpus + SciFact across keyword/semantic/hybrid, with fusion-weight and embedding sensitivity. Findings: hybrid fusion beats both single modes; the hash-embedding fallback is a 5.3× accuracy cliff.
[0.5.6] — 2026-08-20
The reliability release — 18 fixes, highlights:
- FTS5 indexes backfilled after every rebuild — keyword search no longer silently returns zero results after
reindex,drop_column,rename_column, orimport_sql. - Journal processing is chronological with last-op-wins — fixes a permanent journal wedge on TEXT-PK delete-then-reinsert.
- DuckDB analytics supports custom-PK tables; stale broken mirrors are detected and rebuilt automatically at init.
read_queryenforced read-only at the SQLite level (WITH-clause write bypass closed).reconcile()no longer hardcodes anidcolumn — self-healing works on custom-PK tables.GraphAPIexposessearch_graph_pprandsync_graph_nodes.
Full history
The complete changelog lives in the repo: CHANGELOG.md.
Source of truth for this page: HybridDB · open-assistants-lab/HybridDB