DEV Community

AsiaOstrich
AsiaOstrich

Posted on

Our graph database was abandoned upstream — here's the 6-line migration (EngramGraph 0.3.0)

In October 2025, Kùzu Inc. archived KuzuDB — the embedded graph database — with a one-line note: "Kuzu is working on something new." The npm package was deprecated, and its transitive dependencies (tar@6.2.1, npmlog, gauge) carried 5 high-severity vulnerabilities with no fix coming.

EngramGraph runs on an embedded graph database. That database was Kuzu.

EngramGraph 0.3.0 is the migration release — and the migration turned out to be far cheaper than expected. Here's why, and what we learned.

The fix: ryugraph

The community responded to KuzuDB's abandonment with several forks. We evaluated them and picked ryugraph (Predictable Labs):

  • MIT licensed, actively maintained, published on npm
  • Designed as a drop-in Kuzu replacement — and in our experience, it actually is
  • Same storage format lineage: existing .engram/graph.db files keep working

The core API — prepare(), execute(), query(), getAll() — is signature-identical to kuzu. Our entire test suite (69 tests) passed on the first run after the swap.

Why the migration was 6 lines

One architectural decision from day one paid for itself here: every raw database call goes through a single thin wrapper (GraphConnection, ~80 lines). The other 20+ call sites in the codebase only ever see the wrapper.

So the migration was:

  1. package.json: kuzuryugraph
  2. connection.ts: one import line
  3. Two type-only imports (KuzuValueRyuValue)

That's it. If your project wraps its native dependencies behind one interface, an upstream abandonment becomes an afternoon, not a quarter.

The leftover CVEs (and the override trick)

Swapping kuzu killed the deprecated-toolchain CVEs, but ryugraph itself pins cmake-js@^7.3.0, whose tar@6.2.1 carries known path-traversal CVEs. The fix exists upstream (cmake-js@8 uses a patched tar) — ryugraph just hasn't bumped yet.

npm overrides to the rescue:

"overrides": { "cmake-js": "^8.0.0" }
Enter fullscreen mode Exit fullscreen mode

npm audit: 5 high → 0.

One caveat worth knowing: npm overrides don't propagate to downstream consumers. If you depend on engramgraph (or anything that depends on ryugraph), add the same override to your own package.json until ryugraph bumps cmake-js upstream.

Upgrading

npm install engramgraph@0.3.0
Enter fullscreen mode Exit fullscreen mode

One breaking change: the KuzuValue type is now RyuValue. If you imported it, update the import — everything else is unchanged.

MIT · Node ≥ 22 · github.com/AsiaOstrich/EngramGraph

Top comments (2)

Collapse
 
frank_signorini profile image
Frank

What prompted the decision to migrate to EngramGraph specifically, and were there any particular challenges in integrating its query language?

Some comments may only be visible to logged-in visitors. Sign in to view all comments.