Changelog
Notable changes to SoliDB, newest first. For the full commit-level history see
CHANGELOG.md in the repository.
Unreleased
- Columnar collections are a first-class SDBQL data source — a columnar collection was reachable from SDBQL through exactly one shape,
FOR x IN c COLLECT AGGREGATE … RETURN …. Adding aFILTER,SORT,LIMITor join made the same collection report CollectionNotFound, because columnar rows are not stored under the document prefix the scanner walks.FORnow resolves columnar collections directly, so filters, sorts, limits, joins and subqueries work — and columnar data can be combined with documents, edges and vector search in one query. Filter and projection pushdown are not implemented yet, so a selective filter over a large collection still reads less through the/columnar/…/queryendpoint. - Columnar aggregate fixes — four bugs that produced wrong results rather than errors: the
RETURNclause was ignored (RETURN {sum: total}came back as{"total": …}, and a scalarRETURNcame back as an object); grouped queries dropped every aggregate after the first, soAGGREGATE lo = MIN(…), hi = MAX(…)losthi; group and aggregate columns were reported under internal storage names instead of theCOLLECTvariables; and string group keys were double-encoded, soacame back as"\"a\"". The last of these was fixed in the storage layer, so the/columnarREST endpoint benefits too. - Index definitions replicate — an index created on one node existed only on that node: there was no
CreateIndexoperation in the sync protocol, so peers ran unindexed scans and never enforced a unique index they did not have. Worst, the TTL sweep skips a collection with no TTL index, so documents expired on the node where the index was created and lived forever on every other node. Index creation is also shard-aware now — previously an index on a sharded collection was built on the logical collection, which holds no documents. - Physical backup —
POST /_api/backup(admin) takes a RocksDB checkpoint of the whole instance: near-instant, hard-linked, point-in-time consistent across collections. Restore by pointing a server at the directory.solidb-dumpremains the per-database and cross-version path. Because a checkpoint hard-links SSTs on the same filesystem, copy it elsewhere — it is not protection against losing that volume. - Offline sync writes are persisted —
/_api/sync/pushvalidated the session, appended to the replication log and returned{"accepted": N}without ever writing to storage, so pushed documents never existed./_api/sync/conflictsand/_api/sync/resolvenow return501instead of an empty list and{"success": true}; real conflict detection needs per-document version vectors, which storage does not yet carry. - Blob under-replication repair — blob chunks replicate inline at upload and are absent from both recovery paths, so a chunk missed while a peer was down stayed missing. The rebalance worker now scans for under-replicated chunks and re-pushes them.
- Supply-chain checks in CI —
cargo-deny(advisories, bans, licenses, sources), clippy widened to--all-targets --all-features, and a declared MSRV verified by a job that builds it. Two advisories were fixed by version bumps rather than ignored. - Safer
solidb-dump/solidb-restore— columnar indexes go throughcolumnar_indexrecords rather than schemaindexedflags, document dumps are enveloped to avoid field collisions, index-list failures surface, and a partial dump or restore exits non-zero. Adds--scheme,--overwrite(importmode=upsert), path encoding and auth validation. - Dropping a database requires typing its name — the admin confirm modal takes a name confirmation, and the endpoint rejects the delete unless it matches.
v0.32.2
July 25, 2026- Blob collections are restorable from a whole-database dump —
solidb-dumpstreamed the server's single-collection/exportoutput verbatim, and those records name neither the database nor the collection, sosolidb-restoreaborted on the first one with "No collection specified in doc or args". The dump now injects the routing metadata, copying binary payloads through byte for byte. - Collections larger than 10,000 documents are no longer silently truncated — the dump asked for
batchSize1,000,000 and read only the first response, but the server clamps it to 10,000. It now follows the cursor, and warns when the number of documents dumped differs from the reported count. - Empty collections survive a round trip — a collection with no documents and no indexes wrote nothing at all and disappeared from the dump. Every collection now leads with a declaration record carrying its type, so edge, blob and timeseries collections come back as themselves rather than plain document collections.
- Columnar collections are dumped and restored — they live behind their own API and were skipped entirely, while their backing
_columnar_*column family was exported as a phantom empty document collection. - Restore skips an unroutable record instead of aborting the whole run, creates the database once per run rather than once per collection, and treats "already exists" index clashes as success.
v0.32.1
July 24, 2026solidb-restorehonours--database/--collection— both are documented as overrides, but the target was resolved as "name embedded in the dump, falling back to the flag". Since every dump emits_databaseand_collection, the fallback was unreachable and both flags were silently ignored:solidb-restore -d staging --input prod.dumprestored intoprod. The flag now wins and the dump's name is the fallback, across document, blob-chunk and index records. Operators who relied on the old behaviour to restore a dump back into its original database can simply omit-d.
v0.32.0
July 19, 2026Features
- Windows x86_64 builds — releases now include
solidb-windows-amd64.zip(solidb.exe,solidb-dump.exe,solidb-restore.exe) alongside the Linux and macOS tarballs. Three caveats for operators:--daemonis Unix-only and exits with an error. Run SoliDB in a console, or wrap it with a service manager such as NSSM orsc.exe.- The generated
.admin_passwordfile is written with default ACLs rather than the owner-only permissions used on Unix. Restrict the data directory yourself on a shared machine. - FUSE (
solidb-fuse) remains Unix-only, andsolidb updatestill does not support Windows.
Changes
- TLS moves from OpenSSL to rustls — OpenSSL is no longer in the dependency graph at all. The Docker image no longer installs
libssl3, and building from source no longer needslibssl-dev(or Perl/NASM on Windows). Certificate validation now uses the platform trust store via rustls;ca-certificatesis still required in the container image.
Performance
- Vector-index persistence is throttled to at most once per 5s behind a dirty flag, with a shutdown flush, instead of re-serializing the whole index (all vectors + HNSW graph) after every write batch. Bulk loads into embedding-bearing collections are no longer O(batches × index size).
- Document updates that leave every vector index's embedding unchanged skip the delete+reinsert entirely, so an incremental sync that only rewrites metadata pays no HNSW churn.
v0.31.0
July 14, 2026- Document versioning & time-travel — opt-in per-collection history; read the past with
DOC_AS_OF/DOC_HISTORY. Enable it when creating a collection (new option in the admin modal and aversioningflag on the create-collection API) or toggle it later from the collection page. Covers single-document writes; history is capped bySOLIDB_MAX_VERSIONS(default 100). - Semantic query cache — opt-in (
SEMANTIC_CACHE_ENABLED) in-memory cosine-nearest cache for generated-content queries. - Filtered vector search —
VECTOR_SEARCH(coll, idx, vec, k, {filter, overfetch, ef})over-fetches then post-filters, returning{doc, score}rows. - RERANK & RAG_PIPELINE — new SDBQL functions for lexical or LLM reranking and for composing GRAPH_RAG + rerank retrieval pipelines.
- Scheduled materialized views —
CREATE MATERIALIZED VIEW … REFRESH "5m"recomputes a view on an interval. - Auto-embeddings for vector indexes — Create a vector index with
embedding_sourceand SoliDB will automatically generate embeddings on insert using your configured LLM provider (OpenAI, Ollama, Gemini). Works in REST, driver, and SDBQL paths. - Improved stream processing —
CREATE STREAMwindows now properly process events, support sliding/tumbling, and persist results into_streams:<name>collections that are fully queryable and live-queryable. - Graph analytics functions — New SDBQL functions
PAGERANK(edge_collection, opts?)andDEGREE_CENTRALITY(edge_collection)for computing centrality directly in queries.
v0.26.4
June 11, 2026Security
- Per-database authorization on the data plane — every
/_api/database/{db}/...route now enforces role permissions and API-key database scope. SetSOLIDB_DB_AUTHZ_MODE=warnfor dry-run. - Cluster control messages are HMAC-signed — when a keyfile is configured, membership/heartbeat/rebalance messages are signed. All nodes must upgrade together.
- Keyfile required for clusters and replication slowloris protection.
- Lua resource limits — 64 MB memory cap and 30 s execution deadline.
Fixes
- Truncate now replicates from every path.
- Stream processors clear buffered window on truncate.
- Materialized-view refresh reports removed document counts.
Performance
- JOINs scan the joined collection once.
- Graph traversals and shortest-path queries optimized (single edge scan).
- Role lookups and key cache improvements.
Previous Releases
v0.21.2
(2026-03-24)
- SORT performance & correctness improvements (stable sort, index optimization, pre-evaluation).
v0.9.0 / v0.8.0
(2026-02)
- ACID transactions on node.
- Columnar storage and indexes.
- Vector quantization, HNSW, JOIN support, schema validation, many SDBQL enhancements.
- Full list of features and fixes in
CHANGELOG.md.
For the complete detailed history including all minor commits, see the CHANGELOG.md file in the repository.