nanograph 1.3.0
1.3.0 reshapes the query language around one principle: the agent is the user. A query is a tool. The .gq file is the toolbelt. Workflows are sequences of tool calls the agent composes — not multi-stage queries the human composes for them.
New mutation syntax follows directly from that. put upserts by @key in a single statement, so the agent stops writing insert-then-update dances. where { ... } blocks express conjunctive CAS guards — newline-separated atoms, including is null for first-claim — so a claim only goes through if every predicate still holds. Lance OCC plus the row gate guarantee exactly-one-winner under concurrent claims. Every mutation response wraps the affected rows in a matched_nodes envelope, so the agent verifies what it touched without a second query.
On the embedding side, LM Studio joins OpenAI and Gemini as a third provider. Set NANOGRAPH_EMBED_PROVIDER=lmstudio, point at your local LM Studio server, and the same @embed(...) and nearest(...) flow runs entirely on-device. Pairs naturally with on-device LLMs for a fully-local agentic stack.
The runtime got noticeably faster while we were at it. Coordinated bump to Lance 6, Arrow 58, DataFusion 53 pulls in SIMD-accelerated distance kernels, a RaBitQ 4-bit LUT (16× speedup on ARM), and a segmented inverted index for full-text search. Per-runtime hot-path caches eliminate the most common waste in agent loops: query-text embeddings now cache across calls, put upserts skip the dedupe rescan when the source side is already unique, and compiled query plans are cached across executions.
The full design rationale for the language direction lives in ql-canon.md at the repo root.
What shipped
Upgrading
brew upgrade nanograph or grab the binary from the release. Rust crates and the npm package are at 1.3.0. On-disk format is compatible — graphs created on the previous binary open cleanly on 1.3.0.
Star the repo if you want to follow along.