Look Before You Write

How an agent can find the rows that no longer fit a tightened schema and repair them without overwriting a person's edit, using store.describe(), validateStore(), and compareAndSet().

How an agent can find the rows that no longer fit a tightened schema and repair them without overwriting a person's edit, using store.describe(), validateStore(), and compareAndSet().

0.56, 0.67 and 0.68 let a reviewed graph merge wait a day for approval, survive a deploy, reopen in another process, and take input from an at-least-once queue without applying anything twice.

A runtime schema change can now commit or roll back in the same transaction as the graph writes that need it, recorded history, and your own SQL.

How a page listing documents with their newest version, version count, and latest comments went from 33 SQL statements to one, and why batchOnce() throws instead of quietly splitting the work back up.

store.identity records claims that two nodes are the same real-world thing, or provably aren't, keeps them queryable at any point in time after they're retracted, and has the database reject a set of claims that contradicts itself.

How TypeGraph stopped assuming Drizzle, a pg pool, and an engine that locks like Postgres: Drizzle became an optional peer, backends now declare what they can't do, and engine profiles let you adapt a bundled backend to a different engine.

Since 0.55 an edge kind can allow different targets for each source kind, so an assignedTo edge can link employees to departments and students to courses while the other two combinations fail at compile time and at runtime.

A single TypeGraph write used to cost five or six sequential round trips, which adds up to about a quarter of a second from an edge worker to managed Postgres. 0.52 and 0.53 fold most writes into one request.

Five TypeGraph bugs from the last few months that returned plausible answers instead of throwing, how each was fixed, and the tools for checking whether your data was affected.

Put TypeGraph inside a Cloudflare Durable Object and every tenant gets a private graph database that exists the moment you name it and costs nothing while idle.

I ran 17 LDBC queries against five engines at two scales. TypeGraph on SQLite wins every point read, often by 10–100x, and the engines built around an in-memory graph index win whole-graph algorithms by three to four orders of magnitude.

Bitemporal recorded time and provenance-backed retraction let a graph say why it believes a fact, recompute what still holds when a source turns out wrong, and replay what it believed at any commit.

Connected components, weighted shortest path, PageRank, personalized PageRank, and label propagation now run as SQL against your store. On an 18-paper citation graph they turn up things a citation count never would.

Two CRM bots stream what they know about the same person into their own belief graphs. One crashes and resumes without a duplicate row, and entity resolution folds both streams into one canonical record.

Roughly 35 performance fixes across bulk writes, point reads, traversals, and search, plus a caching regression I shipped in 0.34 and fixed properly here.

Graph merge lets independent writers edit isolated branches of a store, then folds them back with deterministic entity resolution, repointed edges, flagged conflicts, and provenance.

Graph extensions let a schema change be proposed at runtime, validated, and committed without a redeploy. I let a small model grow a clinical-research graph from real data, and it found retractions nobody designed for.

TypeGraph now has native BM25 fulltext search and hybrid retrieval with Reciprocal Rank Fusion, on SQLite and Postgres, with no search service to run.

A typed knowledge graph that lives inside your TypeScript app, is defined by one Zod schema, and stores everything in the SQLite or Postgres you already run.