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 a FILTER, SORT, LIMIT or join made the same collection report CollectionNotFound, because columnar rows are not stored under the document prefix the scanner walks. FOR now 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/…/query endpoint.
  • Columnar aggregate fixes — four bugs that produced wrong results rather than errors: the RETURN clause was ignored (RETURN {sum: total} came back as {"total": …}, and a scalar RETURN came back as an object); grouped queries dropped every aggregate after the first, so AGGREGATE lo = MIN(…), hi = MAX(…) lost hi; group and aggregate columns were reported under internal storage names instead of the COLLECT variables; and string group keys were double-encoded, so a came back as "\"a\"". The last of these was fixed in the storage layer, so the /columnar REST endpoint benefits too.
  • Index definitions replicate — an index created on one node existed only on that node: there was no CreateIndex operation 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 backupPOST /_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-dump remains 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/push validated the session, appended to the replication log and returned {"accepted": N} without ever writing to storage, so pushed documents never existed. /_api/sync/conflicts and /_api/sync/resolve now return 501 instead 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 CIcargo-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 through columnar_index records rather than schema indexed flags, document dumps are enveloped to avoid field collisions, index-list failures surface, and a partial dump or restore exits non-zero. Adds --scheme, --overwrite (import mode=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 dumpsolidb-dump streamed the server's single-collection /export output verbatim, and those records name neither the database nor the collection, so solidb-restore aborted 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 batchSize 1,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, 2026
  • solidb-restore honours --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 _database and _collection, the fallback was unreachable and both flags were silently ignored: solidb-restore -d staging --input prod.dump restored into prod. 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, 2026

Features

  • 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:
    • --daemon is Unix-only and exits with an error. Run SoliDB in a console, or wrap it with a service manager such as NSSM or sc.exe.
    • The generated .admin_password file 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, and solidb update still 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 needs libssl-dev (or Perl/NASM on Windows). Certificate validation now uses the platform trust store via rustls; ca-certificates is 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 a versioning flag on the create-collection API) or toggle it later from the collection page. Covers single-document writes; history is capped by SOLIDB_MAX_VERSIONS (default 100).
  • Semantic query cache — opt-in (SEMANTIC_CACHE_ENABLED) in-memory cosine-nearest cache for generated-content queries.
  • Filtered vector searchVECTOR_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 viewsCREATE MATERIALIZED VIEW … REFRESH "5m" recomputes a view on an interval.
  • Auto-embeddings for vector indexes — Create a vector index with embedding_source and SoliDB will automatically generate embeddings on insert using your configured LLM provider (OpenAI, Ollama, Gemini). Works in REST, driver, and SDBQL paths.
  • Improved stream processingCREATE STREAM windows 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?) and DEGREE_CENTRALITY(edge_collection) for computing centrality directly in queries.

v0.26.4

June 11, 2026

Security

  • Per-database authorization on the data plane — every /_api/database/{db}/... route now enforces role permissions and API-key database scope. Set SOLIDB_DB_AUTHZ_MODE=warn for 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.