{"slug": "kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama", "title": "Kuzu Is Deprecated. Here's How I Run Graphiti on One File With Ollama", "summary": "A developer has released Graphiti Local, a tool that runs the Graphiti agent-memory framework on a single embedded file using Ollama and LadybugDB, the maintained fork of the deprecated Kuzu graph database. The setup avoids Neo4j, Docker, and OpenAI keys by using a one-writer, many-read-only-readers file model, with an MCP server exposing six read-only tools and a human-approved drain step before any facts reach the graph. On an Apple M5 with 32 GiB, database setup took 1.3 seconds, local extraction ingest 34.4 seconds, and queries 1.3 seconds.", "body_md": "*Last tested: September 2026, graphiti-core 0.30.1, LadybugDB 0.19, Ollama with qwen2.5:7b and nomic-embed-text.*\n\nGraphiti's quickstart assumes a graph database server and an OpenAI key. For agent memory on one machine, both are optional, and the choice that remains is which embedded file backend to use. It matters more than it looks, because it decides whether your agent can keep reading while new facts are written.\n\nGraphiti can run without Neo4j or Docker on an embedded backend that keeps the graph in a local file. Kuzu is deprecated upstream. FalkorDB Lite is maintained but allows one process per file. LadybugDB, the maintained Kuzu fork, allows one writer plus many read-only readers, which is what an agent that reads during ingest needs.\n\n| Backend | Install | State | Concurrent access | \n|---|---|---|---|\n| Kuzu | `graphiti-core[kuzu]` | Deprecated, upstream unmaintained | Do not start new work | \n| FalkorDB Lite | `graphiti-core[falkordblite]` , Python 3.12+ | Maintained | One process per file | \n| LadybugDB | `ladybug` through the Kuzu driver | Maintained Kuzu fork | One read-write open plus read-only opens | \n\nLadybugDB has no driver of its own in Graphiti. It is a continuation of Kuzu, so it runs through the Kuzu driver once the package answers to the old name:\n\n``` python\nimport sys\nimport ladybug\n\nsys.modules.setdefault(\"kuzu\", ladybug)  # Graphiti imports the predecessor by its old name\n\nfrom graphiti_core import Graphiti\nfrom graphiti_core.driver.kuzu_driver import KuzuDriver\n\ndriver = KuzuDriver(db=\"graph.ladybug\")\ngraphiti = Graphiti(graph_driver=driver)\n```\n\nOne trap on this path: the Kuzu driver declares its full-text indexes, but its `build_indices_and_constraints` does nothing, so the indexes are never created and every hybrid search fails with a Binder exception. Create them yourself on the first read-write open. [Graphiti Local](https://renezander.com/projects/graphiti-local/) does this in its setup command and refuses a read-only open without them.\n\nAn embedded file makes the write path visible, because only one process may hold it for writing. I use that constraint as the design: readers open the file read-only, and the one read-write open is a command a person runs.\n\nIn Graphiti Local the MCP server exposes six tools, all reads. When an agent learns something, it files a proposal outside the graph file. Nothing reaches the graph until a person approves it and runs the drain. A 7B model turning a meeting note into three confident, wrong entities is the reason: a bad answer can be retried, a bad memory keeps coming back.\n\nBefore 0.3.0 the server held the write lock and locked every other command out of its own database. Opening readers read-only fixed that; the server picks up what the drain wrote without a restart.\n\n```\nuvx --from git+https://github.com/renezander030/graphiti-local kg-demo\n```\n\nOn a clean directory this took 10 seconds and installed 54 packages. It answers a question against a small synthetic graph with keyword search only, so no model is contacted and nothing needs Ollama. The full local setup:\n\n```\ngit clone https://github.com/renezander030/graphiti-local.git && cd graphiti-local\nuv sync --frozen\nollama pull qwen2.5:7b && ollama pull nomic-embed-text\nexport GRAPHITI_LOCAL_CONFIG=\"$PWD/config/ollama.example.yaml\"\nexport KG_WORKSPACE_DIR=\"$PWD/workspace/local-demo\"\nexport KG_LADYBUG_PATH=\"$KG_WORKSPACE_DIR/graph.ladybug\"\nuv run --frozen kg-ladybug-setup --database \"$KG_LADYBUG_PATH\" --apply\nuv run --frozen kg doctor\nuv run --frozen kg-ingest examples/local_memory_demo.jsonl --apply\nuv run --frozen kg ask \"Which database does Aurora Analytics use?\" example\n```\n\nMeasured on an Apple M5 with 32 GiB on the shipped synthetic fixture, excluding model and dependency downloads:\n\n| Step | Seconds | \n|---|---|\n| Database setup | 1.3 | \n| `kg doctor` | 0.5 | \n| Ingest (local extraction) | 34.4 | \n| Query | 1.3 | \n| Approve and apply an update | 44.7 | \n\nRetrieval is fast enough for an agent loop. Extraction is a local model producing structured output, and it is the step to batch or run overnight.\n\nVectors from one embedder are not comparable to vectors from another, even under the same model name. In my own graphs, `nomic-embed-text` on a second Ollama build scored 0.80 cosine against stored vectors where the original scored 1.00. Nothing errors; every search ranks a little worse. Graphiti Local records which embedder wrote the database, and an ingest with a different one exits 2.\n\nThe width is the second silent failure: `nomic-embed-text` returns 768 dimensions, not the 1536 an OpenAI default assumes. `kg doctor` probes the endpoint and fails when the configured width disagrees.\n\nIf you try the setup, the repository has an issue template for [setup results](https://github.com/renezander030/graphiti-local/issues/new?template=setup-result.yml), blocked ones included. The full-text index fix above came out of exactly that kind of report. For server backends, read [Graphiti in production](https://renezander.com/guides/graphiti-in-production/); for the concepts, the [temporal knowledge graph guide](https://renezander.com/guides/temporal-knowledge-graph/).\n\n*Graphiti Local is my independent open-source project built on Graphiti. It is not affiliated with or endorsed by Zep.*\n\n*I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, [how I put a human approval step in front of agent writes](https://renezander.com/hitl-approval/) is the companion download.*", "url": "https://wpnews.pro/news/kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama", "canonical_source": "https://dev.to/reneza/kuzu-is-deprecated-heres-how-i-run-graphiti-on-one-file-with-ollama-4bfk", "published_at": "2026-09-23 08:00:39+00:00", "updated_at": "2026-09-23 08:23:28.193116+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "ai-infrastructure", "mlops", "developer-tools"], "entities": ["Graphiti", "Kuzu", "LadybugDB", "FalkorDB Lite", "Ollama", "Neo4j", "Graphiti Local", "qwen2.5:7b"], "alternates": {"html": "https://wpnews.pro/news/kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama", "markdown": "https://wpnews.pro/news/kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama.md", "text": "https://wpnews.pro/news/kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama.txt", "jsonld": "https://wpnews.pro/news/kuzu-is-deprecated-here-s-how-i-run-graphiti-on-one-file-with-ollama.jsonld"}}