Skip to content

Releases: katsut/stromadb

v0.3.0 — a standalone application: one command, a populated first run, N agents on one graph

Choose a tag to compare

@katsut katsut released this 12 Aug 08:36
5abf797

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

Choose a tag to compare

@katsut katsut released this 30 Jul 03:36
447a5bb

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 a many-predicate carries its own valid-time interval; close ends one element's interval (history stays sliceable), and point / expand accept valid_at for as-of reads over both cardinalities. Late-arriving values cannot resurrect an ended element. (D23)
  • timeline op (#203) — the interval form of as-of: the full valid-time timeline of one predicate, or of a value derived through a chain of one-predicates ({"op":"timeline","subject":1,"hops":["member-of","manager-of"]} → sorted {value, valid_from, valid_to} segments). Agrees with the point-wise valid_at composition at every instant, by construction. Also an MCP tool.
  • Changelog compaction (#175) — POST /compact persists 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); condition equals now accepts the documented object forms ({"node": N}, …), so rules can be scoped to a subgraph anchor.
  • Incremental conformance maintenance (#202) — conformance_watch keeps 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_changes returns 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. /stats exposes 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

Choose a tag to compare

@katsut katsut released this 16 Jul 06:32
183dc48

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 crates stromadb-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-serve now exposes the MCP tool set at POST /mcp (streamable HTTP, same auth as the other endpoints), so the web console and MCP agents share one live database. The stdio stroma-mcp binary 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

Choose a tag to compare

@katsut katsut released this 15 Jul 13:32
458867d

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: stroma CLI, stroma-serve HTTP + 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.