Skip to main content
nanograph
← All updates

nanograph 1.2.0

Committed graph state no longer lives in graph.manifest.json. New graphs initialize as NamespaceLineage on Lance 4, with committed state in Lance-backed internal tables.

The payoff: CDC is deterministic and reconstructed from Lance lineage instead of WAL replay, graph_version is a single clean version unit, managed media is database-owned (content-addressed in __blob_store), and stable row ids make external mirroring safe to rely on. One source of truth, no more scripts patching graph.manifest.json.

nanograph check has been replaced by nanograph lint, which combines strict per-query validation with whole-file coverage checks. The CLI, TypeScript SDK, and Swift SDK are all aligned to the new CDC contract.

1.2.0 is the canonical stable release for the new storage line. It supersedes v1.1.2.

What shipped

NamespaceLineage defaultNew graphs initialize as NamespaceLineage. Committed state lives in Lance-backed internal tables, not graph.manifest.json. Managed imported media lives in __blob_store.
Lance 4 in productionTable writes use namespace-backed Lance 4 datasets, storage pinned to data format 2.2, stable row ids enabled for new tables. Cleanup and doctor understand retained lineage windows.
Lineage-native CDCNew graphs commit through __graph_tx, __graph_deletes, and __graph_snapshot. Inserts and updates are reconstructed from Lance lineage; deletes preserved as tombstones. Public CDC now uses graph_version.
nanograph lintcheck has been replaced by lint. Combines strict per-query validation with whole-file coverage checks. With --schema, validates against the file directly instead of the current DB schema.
First-class migration pathsstorage migrate --target lineage-native creates a fresh NamespaceLineage graph with a new CDC epoch. The previous storage root is kept as a .v3-backup. Unmigrated legacy databases no longer open for read/write in 1.2.Migration guide
Aligned SDK and CLI surfacesTypeScript and Swift SDKs expose the current changes() contract. CLI changes and docs speak in graph_version. Migration and doctor output reflect NamespaceLineage.

Migrating to NamespaceLineage

The old graph.manifest.json / _wal.jsonl mental model is legacy-only in 1.2. New graphs commit and replay from Lance-native state —__graph_snapshot, __graph_tx, and __graph_deletes. Scripts or tools that read or patch the old manifest and WAL need to stop for migrated graphs.

Unmigrated legacy databases no longer open for normal reads and writes in the 1.2 line. The CLI fails fast and prints the exact migration command. The supported upgrade path is:

nanograph storage migrate --db <db>.nano --target lineage-native

Migration copies the currently visible graph state into a fresh NamespaceLineage database, swaps the root on success, and keeps the original as <db>.nano.v3-backup. It is intentionally not history-preserving — the migrated graph starts a fresh CDC epoch and graph_version restarts from 1. Managed imported media is rewritten into __blob_store and exposed as lanceblob://sha256/... URIs.

See the storage migration guide for pre-flight checks, verification, and rollback.

Upgrading

brew upgrade nanograph or grab the binary from the release. Rust crates, the npm package, and Swift packaging examples have all been bumped to 1.2.0.


Star the repo if you want to follow along.