Omnigraph v0.7.0
v0.7.0 takes the cluster control plane to object storage and overhauls the
v0.7.0 takes the cluster control plane to object storage and overhauls the
configuration architecture around two single-owner surfaces. A cluster —
state ledger, content-addressed catalog, and graph data — can now live
entirely on an S3-compatible bucket, and a server can boot from that bucket
with no local files at all. Operator identity, credentials, and personal
aliases move to a home-level config; the legacy combined omnigraph.yaml
enters a guided, staged deprecation.
Highlights
- Clusters on object storage (
storage:).cluster.yamlgains an optionalstorage: s3://bucket/prefixroot. Every stored byte — the state ledger, lock, recovery sidecars, approval artifacts, catalog blobs, and the derived graph roots (<storage>/graphs/<id>.omni) — flows through one storage layer, sofile://(the default, byte-compatible with existing clusters) ands3://are a single code path. The ledger's compare-and-swap uses S3 conditional writes (If-Match/If-None-Match), verified against AWS semantics, RustFS, and Tigris-backed stores; the state lock is genuinely cross-machine on object storage. - Config-free serving:
--cluster s3://bucket/prefix. The server accepts a bare storage-root URI and boots from the applied revision on the bucket — the ledger and catalog are the whole deployment artifact. Policy bundles serve as digest-verified content from the catalog (never re-read from disk), closing the last gap for fully remote clusters. The preferred container shape becomes bucket, no volume (seedocs/user/deployment.md). - Per-operator configuration (
~/.omnigraph/). A home-level config carries operator identity (operator.actor, the new last hop of the--aschain), output defaults, named servers, and personal aliases.$OMNIGRAPH_HOMErelocates it;$OMNIGRAPH_CONFIGnow stands in for--configin both binaries. - Credentials keyed by server name.
omnigraph login <server>stores a bearer token in~/.omnigraph/credentials(created0600; over- permissive files are refused). Token resolution for a request whose URL matches an operator-defined server:OMNIGRAPH_TOKEN_<NAME>env → the credentials file → the legacybearer_token_envchain unchanged. A token is only ever sent to the server it is keyed to. - Operator targeting and aliases.
--server <name>(with--graph <id>for multi-graph servers) addresses operator-defined endpoints on every remote-capable command. Operator aliases are pure bindings — personal name → (server, graph, stored-query name, default params) — invoking catalog-owned stored queries; they carry no query content. omnigraph.yamldeprecation begins. Loading the legacy file prints a per-key notice naming each present key's new home (OMNIGRAPH_SUPPRESS_YAML_DEPRECATION=1to silence in CI).omnigraph config migrateproposes — and with--write, applies — the split: team half to a ready-to-reviewcluster.yaml, personal half merged into the operator config (existing entries always win).omnigraph initno longer scaffolds the file. Migrated teams can setOMNIGRAPH_NO_LEGACY_CONFIG=1to turn any legacy-file load into a hard error. The file itself keeps working until its removal at the next major version.
Breaking / behavior changes
omnigraph initno longer writes anomnigraph.yamlinto the working directory. Start cluster configs from the documentation templates, or runomnigraph config migrateagainst an existing legacy file.- Loading a legacy
omnigraph.yamlnow emits a deprecation block on stderr (suppressible; see above). Output on stdout is unchanged. ServingPolicy(cluster crate API) carries verified policy content instead of a blob path;read_serving_snapshotand several cluster command entry points are now async.
Upgrade notes
- Existing clusters need no migration: an absent
storage:key keeps the config-directory layout byte-for-byte. - Existing
omnigraph.yamlsetups keep working through the deprecation window;omnigraph config migrateproduces the recommended split. - Operator setup is three lines:
mkdir -p ~/.omnigraph, writeoperator.actor(andservers:) into~/.omnigraph/config.yaml, thenecho $TOKEN | omnigraph login <server>.
Internals
- The cluster, server, and CLI crates were modularized (the 7.9k-line
cluster
lib.rsis now eight focused modules; the server and CLI test monoliths split into per-area suites) — pure code movement, no behavior change. - New gated end-to-end suites run the full cluster lifecycle against a real S3-compatible store in CI, including a lock-release regression and a config-free server boot from a bare bucket URI.
- The deployment guide gains the bucket-no-volume container recipe for AWS and Railway, validated against a live Railway deployment (Railway buckets are S3-compatible and pass the conditional-write contract test).