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 (DuplicateIDError on 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_ids all use the pk; reconcile is scheme-aware.
    • Regression test: the TEXT-PK delete+reinsert scenario can no longer produce duplicate vector keys.

[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 olap cost nothing to maintain.

Fixed

  • Operator-form where ({"score": {"$gte": 50}}) was silently ignored in keyword mode — the post-filter now evaluates the standard operators so where= 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 via executemany.
  • Batched restores: update-heavy rollbacks 3,931ms → 107ms at 100k rows via split batched INSERT/UPDATE (41× the removal path). Chroma re-embedding of restored LONGTEXT remains 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), prune with 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; __history names reserved; history tables excluded from list_tables, DuckDB mirroring, and graph sync.
  • Clear error for id columns lacking PRIMARY KEY.
  • fork is deferred — checkpoint/rollback covers the agent-memory rewind workflow.

[0.5.8] — 2026-08-25

  • Packaging fix: dependencies were misplaced in pyproject.toml, so published wheels carried no dependency declarations — a fresh pip install hybriddb did not pull in chromadb. Fixed.

[0.5.7] — 2026-08-25

Performance

  • insert_batch 13× 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 REAL as DOUBLE (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, or import_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_query enforced read-only at the SQLite level (WITH-clause write bypass closed).
  • reconcile() no longer hardcodes an id column — self-healing works on custom-PK tables.
  • GraphAPI exposes search_graph_ppr and sync_graph_nodes.
Full history

The complete changelog lives in the repo: CHANGELOG.md.

Source of truth for this page: HybridDB · open-assistants-lab/HybridDB