v0.3.0 — a standalone application: one command, a populated first run, N agents on one graph
LatestStromaDB 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