Releases: katsut/stromadb
Release list
v0.3.0 — a standalone application: one command, a populated first run, N agents on one graph
StromaDB grew into a standalone application in this release: one install, one command, a populated first run, your own CSV loaded from the browser, and N agents sharing one live graph — each with its own identity.
One binary, one command (#215)
cargo install stromadb alone now yields the whole application. stroma serve runs the full HTTP surface in-process (the stroma-serve binary still ships and behaves identically), and stroma up is the just-run-it verb — a fresh directory defaults to ./stroma-db instead of littering the cwd. The Docker entrypoint switched to the unified binary.
--demo: a populated first run (#211)
stroma up --demo boots a self-contained sample org graph — department transfers (multi-segment timelines), a manager change, releases with a planted self-approval / stale approval / missing sign-off, names corroborated by two/one/zero sources, docs with bundled embeddings — and prints the console URL, three copy-paste queries, and a ready-to-paste claude mcp add command with a minted bearer token. Seeds only an empty database; restarts never duplicate.
Building the demo against SPEC's own examples surfaced and fixed two spec/impl gaps: ingest now accepts the documented source_def record (#226), and edge-property values accept the documented typed-object form alongside bare scalars (#227).
Console: the temporal reads, in the browser (#217)
The Query tab gained as-of (a datetime on the point read), timeline (a hop chain rendered as interval bars on a shared axis, open ends dashed to now, with the answer's weakest-link confidence tier), and conformance (run a stored rule; verdict counts + gap rows linking into the graph). The schema op additively lists stored rule names.
Console: CSV import + CLI twin (#212)
An Import tab: drop a CSV (UTF-8 enforced with a readable hint, BOM stripped, RFC 4180), assign each column a role — property / row id / edge / valid_from / valid_to / skip — with pre-flight warnings when a predicate already exists with a different cardinality or range. stroma import data.csv --type Person --id id --valid-from hired --edge dept:Department:member-of is the scriptable twin. Node ids are a deterministic 48-bit hash of (type, row id) — re-imports are no-ops, cross-file references line up, and the browser and CLI implementations are pinned against each other by test vectors.
Named API tokens (#213)
A token registry (--tokens tokens.json) gives each client an identity: writes arriving on a named token carry its name as provenance (agreement between different agents now counts as corroboration in confidence signals), an optional ABAC labels cap bounds every read (intersected with the request — narrowable, never widenable), and read_only tokens get a clear 403 on writes. HTTP and MCP share one scoped dispatch. The legacy single --api-token keeps working unchanged.
This work also closed a read-scoping gap: point / expand / timeline now honor allowed_labels (denied / filtered / empty), so a direct id probe can no longer read what a search would hide.
Security
Session tokens are minted from the OS CSPRNG via getrandom and fail closed — on platforms without /dev/urandom the old path silently produced an all-zero (forgeable) token (#218).
Install: cargo install stromadb · docker run -p 7687:7687 ghcr.io/katsut/stromadb:latest --demo
Docs: SPEC.md · DECISIONS.md
v0.2.0
Temporal reads grew up in this release: full valid-time history for many-edges, interval-valued answers ("when was", not just "as of"), live-maintained rule verdicts, bounded cold starts via changelog compaction, and a vector index that notices when its quantizers stop fitting the data.
Since v0.1.1:
- Valid time for
many-cardinality elements — each element of amany-predicate carries its own valid-time interval;closeends one element's interval (history stays sliceable), andpoint/expandacceptvalid_atfor as-of reads over both cardinalities. Late-arriving values cannot resurrect an ended element. (D23) timelineop (#203) — the interval form of as-of: the full valid-time timeline of one predicate, or of a value derived through a chain ofone-predicates ({"op":"timeline","subject":1,"hops":["member-of","manager-of"]}→ sorted{value, valid_from, valid_to}segments). Agrees with the point-wisevalid_atcomposition at every instant, by construction. Also an MCP tool.- Changelog compaction (#175) —
POST /compactpersists the full fold state as a snapshot and truncates the covered WAL (old prefix archived). Cold start becomes snapshot-load + tail replay; as-of reads keep answering across the boundary, byte-identically. Measured on a live database: WAL 7.77 MB → 21 B. (D24) - Conformance rule expressiveness (#204) —
distinct_from: a must-differ derived path (a self-approval ban is one line); conditionequalsnow accepts the documented object forms ({"node": N}, …), so rules can be scoped to a subgraph anchor. - Incremental conformance maintenance (#202) —
conformance_watchkeeps a stored rule's verdicts current in O(touched) per write via support-set tracking (one upstream write re-judges exactly the subjects whose derived paths run through it);conformance_changesreturns old→new verdict diffs behind a cursor. Property-tested equal to full re-evaluation after every event; measured 106×–1,812× cheaper than per-poll re-evaluation at 1K–100K subjects. (D26) - Vector index drift detection (#200) — training records a quantizer-fit baseline and every add updates the live fit; rebuilds reuse the trained quantizers (skipping k-means) until the drift ratio or corpus growth says otherwise, and training samples now span the whole corpus instead of the oldest prefix.
/statsexposes the fit numbers. (D25) - Container images carry OCI labels (#193); Docker quickstart leads with the published image.
Details and honest limits: docs/DECISIONS.md D23–D26. API shapes: SPEC.md.
Install: cargo install stromadb · docker run -p 7687:7687 ghcr.io/katsut/stromadb:latest
v0.1.1
First release on crates.io — cargo install stromadb now works (installs the stroma binary).
Since v0.1.0:
- crates.io publishing: the workspace ships as
stromadb(CLI),stromadb-serve,stromadb-mcp, and the internal library cratesstromadb-core/stromadb-store(no API stability guarantees pre-1.0; the supported surfaces are the CLI, HTTP server, and MCP). - Data-directory lock (#186): concurrent opens of the same data directory now fail fast with a clear error instead of risking WAL corruption.
- MCP over HTTP (#187):
stroma-servenow exposes the MCP tool set atPOST /mcp(streamable HTTP, same auth as the other endpoints), so the web console and MCP agents share one live database. The stdiostroma-mcpbinary is unchanged, now backed by the same shared dispatch. - Container images for this tag are published to
ghcr.io/katsut/stromadb(linux/amd64 + linux/arm64). - Docker build fix: the build stage now installs clang/mold required by
.cargo/config.toml(#190); image builds are validated in CI on Dockerfile changes. - README license wording fix: source-available (ELv2), not open-source.
Install: cargo install stromadb · docker run -p 7687:7687 ghcr.io/katsut/stromadb:latest
v0.1.0
First tagged release.
- Durable changelog engine: framed WAL, group-commit fsync, prefix-exact recovery
- Typed property graph: first-class typed edges with per-edge properties; domain/range and cardinality checks on ingest
- Type-aware hybrid search: IVF-PQ vector index with exact re-rank
- Composable query IR (point / type-ANN / expand / filter / top-k) with incremental Live Query maintenance
- Temporal reads: valid-time as-of point reads; transaction-time pinning via version vector (strict / fresh)
- Surfaces:
stromaCLI,stroma-serveHTTP + built-in web console,stroma-mcp(MCP tools), Docker image
Pre-1.0: single-node, single-threaded serving — see docs/DECISIONS.md for known limitations and the roadmap. Source-available under Elastic License 2.0.
Measured performance and one-command reproductions: README § Performance.