Slater – Low-memory graphdb designed for read-heavy graphs Hikari Systems released Slater v0.24.1, a low-memory graph database designed for read-heavy graphs that can serve hundreds of millions of nodes and billions of edges from a few hundred MB of RAM by paging from disk instead of holding the graph resident. Slater uses a log-structured-merge writable layer over an immutable core, supports the Bolt protocol for compatibility with Neo4j drivers, and includes disk-native vector search, making it suitable for knowledge graphs, recommendation systems, and identity graphs. Current version: v0.24.1 β€” all releases https://github.com/Hikari-Systems/slater/releases . In one line:Slater servesgraphs that don't fit in memoryβ€” hundreds of millions of nodes and billions of edges in low hundreds of MB of RAM β€” over standardBolt, so any neo4j driver just works, with disk-native vector search sitting next to the graph, and it takeslive, durable writeswithout giving that up. Resident memory is set by a cache budget you choose,notby the size of the graph. Shortcuts | Reads and writes reads-and-writes What you get what-you-get Features features How it works how-it-works The writable layer the-writable-layer Storage backends storage-backends-filesystem--s3--gcs Mounts mounts ACL acl Health check health-check Worked example worked-example Development development Performance performance License license πŸ“– Full manual /Hikari-Systems/slater/blob/main/docs/manual/README.md A graph database stores data as things nodes and the relationships between them edges , with the relationships as first-class citizens. That's what you want when your questions are about connections rather than rows β€” "who's within three hops of this account?", "what's the full dependency chain behind this build?", "which accounts share a device, an address, and a card?" β€” the queries that become a swamp of recursive joins in SQL but fall out naturally in a graph. The most common complaint about graph databases is that they don't scale past what you can hold in RAM. Many of them eg neo4j, Memgraph, FalkorDB, etc keep the whole graph resident: a 40 GB graph wants 40 GB of memory β€” per instance . Want a replica per region, per tenant, or per pod? Multiply the bill. And past a certain size they simply won't load: eg the 90 million node / 1.5B-edge Wikidata graph needs ~64–128 GiB resident, so the in-memory engines can't open it at all. Slater is the rebuttal. It serves that same 90M-node graph from a few hundred MB of RAM , because it pages the graph from an on-disk image on demand instead of holding it resident β€” so the graph size and the memory bill are decoupled. Slater takes the opposite approach. You compile the graph once, offline, into a content-addressed on-disk image with slater-build ; then any number of Slater servers serve it over Bolt so your existing neo4j drivers just work while holding only a fixed cache budget in memory. A 4 GB graph and a 400 GB graph cost the same RAM to serve β€” you fan out cheap, stateless read replicas and let the store, not the heap, hold the graph. That makes it a natural fit for knowledge graphs behind RAG, recommendation and identity graphs, dependency graphs β€” anything large and connected you want to query cheaply and often. Disk-native vector search lives right next to the graph, so the same engine is the retrieval layer for embeddings too. Slater is a read-write graph database. You don't rebuild the whole image to correct one property, add a node, or retract an edge β€” you write the change directly, over Bolt, and it lands durably. The trick is that writes never tax the read path. Writes accumulate in a log-structured-merge LSM layer over the immutable core : a write-ahead log and an in-memory table, spilling to immutable delta segments, folded back into a fresh core by a periodic consolidation . What that buys you: Reads over an unwritten graph cost exactly what they did before. An empty delta is a single predictable branch, not a merge β€” the read path is byte-identical whether or not the writable layer is on. The read cost of a write scales with the size of the delta, not the size of the graph. Whole-graph answers β€” count , the label and relationship-type marginals β€” stay metadata reads even with writes outstanding: the delta keeps its own counters, so a count over a 91.6M-node core with half a million pending writes still answers in tens of milliseconds without touching a single block. Acknowledged means durable. A single writer drains the queue and returns SUCCESS only after the fsync that covers the write. Group your writes and they're cheap β€” a write- UNWIND commits one fsync per batch rather than per row. Business-key writes, in either dialect. MERGE / MATCH … SET / DELETE and CREATE / REMOVE , detach delete, relationship writes keyed on a node's identity property β€” or the equivalent ISO GQL data-modifying statements INSERT / SET / REMOVE / DELETE , which lower onto the same path. Correct, insert, upsert and retract, over nodes and edges, addressed the way your data already is. The writable layer is opt-in delta.enabled ; with it off, Slater serves the pure immutable core and refuses writes. See The writable layer the-writable-layer for the full model. On the name.Slater is named after the CIA agent inArcher a great show who insists on going by a single name β€” "Just… Slater" β€” and one of my favourite characters in it. See the character wiki page . RAM set by your cache budget, not your graph size β€” fan out as many read replicas as you like; the graph never has to fit in memory. A drop-in for the graph β€” speaks Bolt, so any standard neo4j driver JS, Python, Go… works unchanged. It's Cypher plus a slice of ISO GQL, reads and writes ; nothing new to learn. Live, durable writes β€” an opt-in LSM layer over the immutable core: business-key MERGE / SET / DELETE over nodes and edges, group-committed and fsync -durable, folded back into a fresh core by consolidation. Reads don't pay for it. Deployment by file swap β€” build a new content-hashed generation offline, atomically flip the current pointer, and servers pick it up. Every block is checksummed, so a half-copied image is refused rather than served. Vector search built in β€” disk-native approximate-nearest-neighbour cosine, L2, or dot KNN sits right next to your graph, for when this is the retrieval layer behind a RAG pipeline, and embeddings are writable in place β€” no offline rebuild to add or change a vector. Locked down by design β€” read and write grants are independent, plus optional at-rest encryption, TLS Bolt, argon2id-hashed ACLs, and a read-only container rootfs for read replicas. | Feature | What it means for you | |---|---| Bounded, predictable memory | Resident memory is capped by three cache budgets you set β€” it does not grow with graph size; you tune the performance/RAM trade-off instead of provisioning for the whole graph. A jemalloc allocator with background purge returns freed memory to the OS after heavy query bursts, so resident size falls back toward its idle floor rather than staying pinned at the post-burst high-water mark. | Multi-tenant out of the box | One server hosts many graphs with per-user read grants β€” multi-database isolation that most graph DBs reserve for a paid/enterprise tier. | Encryption at rest & in transit | Per-block XChaCha20-Poly1305 sealing the key is never written to disk plus optional TLS bolt+s:// . GDPR-friendly by construction. | Tiny, dependency-light install | A small stripped binary on a distroless glibc base no shell/apt β€” the multi-arch amd64/arm64 image pulls at ~22 MB, or ~12 MB for the server-only slater:latest-lite tag; pure-Rust TLS, no OpenSSL. Pull and run. | Built for periodic publish | Build a graph offline, serve it immutable, then atomically swap in a new version with zero downtime β€” ideal for data-warehouse / scheduled-refresh workloads. | Rugged under load | The server and offline builder both compile with forbid unsafe code β€” the engine's only unsafe lives in the audited jemalloc allocator crate. The core is immutable, so reads take no locks and never wait on a writer; a single writer serialises mutations behind the write path alone. No GC pauses, no data races. One bad query can't take the server down. | Works with your neo4j tools | Speaks Bolt 5.4 / 4.4 / 4.1 β€” use the standard neo4j drivers JS, Python, Go, Java… , cypher-shell , or graph browsers unchanged. | Rich Cypher query surface | A broad read surface: MATCH / WHERE / WITH / UNION , CALL {…} subqueries, 70+ functions & aggregations, temporal & geospatial values, and regex. | Live, durable writes | An opt-in single-writer LSM layer over the immutable core delta.enabled : business-key MERGE / SET / DELETE / CREATE / REMOVE over nodes and relationships, batched write- UNWIND one fsync per batch , and CALL slater.consolidate β€” group-committed, fsync -durable, and folded back into a fresh core by consolidation. The read path is byte-identical when the delta is empty. | ISO GQL, read and write | Speaks a subset of ISO GQL ISO/IEC 39075 over the same Bolt connection β€” quantified paths, path restrictors, shortest-path selectors, label/type boolean expressions, FOR , CAST , an optional GQL / CYPHER dialect prefix β€” and, with the writable layer on, GQL's data-modifying statements INSERT / SET / REMOVE / DETACH DELETE lower onto the same durable write path. Cypher and GQL, reads and writes, in one engine. | Vectors + graph in one engine | Disk-native ANN vector search Vamana + PQ; cosine / L2 / dot for embeddings/RAG, plus graph algorithms PageRank, BFS, betweenness, WCC… β€” bounded memory even with millions of vectors. Embeddings are writable a FreshDiskANN-style write ladder : insert / update / delete a vector, KNN-visible at once, folded into the base without a rebuild. | Safe on network storage | Every file is BLAKE3 content-hashed and verified on open; torn or half-copied images are refused, not served. Designed for NFS/remote volumes no mmap surprises . | Pluggable storage backends | Serve the same generation format from a local filesystem, an S3 S3-compatible bucket, or a Google Cloud Storage bucket β€” publish once, fan out to stateless replicas β€” with an optional local-SSD cache tier in front of the object store. See | Two binaries make up the workspace: | Binary | Role | |---|---| slater | The online Bolt server the container ENTRYPOINT : serves reads and, with delta.enabled , the single-writer durable write path. | slater-build | The offline compiler: turns a primitive-Cypher dump into an immutable, content-hashed generation directory. | Slater splits bulk building from serving : slater-build does the heavy lifting offline β€” ingesting your data and compiling it into an immutable generation β€” so a cold graph is never assembled on the serving hot path. Within the server, the read surface answers a broad Cypher slice β€” pattern matching, WITH / UNION / CALL {…} subqueries, 70+ scalar & aggregate functions, temporal & geospatial values, graph algorithms algo. , and disk-native vector KNN db.idx.vector.queryNodes β€” while the writable layer's delta overlay sits below that surface and is zero-cost when empty, so reads never carry the write-side machinery. You can update a graph two ways: write to it live over Bolt see The writable layer the-writable-layer , or build a new generation offline and atomically swap the current pointer, which the running server picks up via its generation guard see Generation guard generation-guard . The complete user manual lives in β€” a feature-by-feature guide that explains, for every capability, what it is, why it exists, and how to use it, with worked examples you can run against a bundled sample graph. Start there for anything beyond this overview. docs/manual/ New here? Quickstart /Hikari-Systems/slater/blob/main/docs/manual/02-quickstart.md builds and serves a graph in five steps. Writing queries? Querying /Hikari-Systems/slater/blob/main/docs/manual/07-querying.md , Functions & expressions /Hikari-Systems/slater/blob/main/docs/manual/08-functions-and-expressions.md , Procedures & algorithms /Hikari-Systems/slater/blob/main/docs/manual/09-procedures-and-algorithms.md , Vector search /Hikari-Systems/slater/blob/main/docs/manual/10-vector-search.md , Writing data /Hikari-Systems/slater/blob/main/docs/manual/11-writing-data.md . Building graphs? Building graphs /Hikari-Systems/slater/blob/main/docs/manual/05-building-graphs.md and the Build CLI reference /Hikari-Systems/slater/blob/main/docs/manual/06-build-cli-reference.md . Operating Slater? Deployment /Hikari-Systems/slater/blob/main/docs/manual/13-deployment.md , Storage /Hikari-Systems/slater/blob/main/docs/manual/12-storage.md , Configuration reference /Hikari-Systems/slater/blob/main/docs/manual/14-configuration-reference.md , Security /Hikari-Systems/slater/blob/main/docs/manual/15-security.md , Performance tuning /Hikari-Systems/slater/blob/main/docs/manual/16-performance-tuning.md . Slater is designed to be run as a Docker deployment β€” that's the expected way to use it. Prebuilt multi-arch images linux/amd64 + linux/arm64 are published to Docker Hub at , tagged hikarisystems/slater :latest and :vX.Y.Z on every release: docker pull hikarisystems/slater:latest A Docker-command-only usage, configuration, and operations guide lives in DOCKERHUB.md /Hikari-Systems/slater/blob/main/DOCKERHUB.md and is mirrored to the Docker Hub overview page β€” start there if you're deploying. In short: Build a graph generation with the offline writer: docker run --rm -v slater-data:/data -v "$PWD/dumps:/dumps:ro" \ --entrypoint /app/slater-build hikarisystems/slater:latest \ --input /dumps/people.cypher --graph people --data-dir /data Serve it over Bolt on 7687 read-only unless delta.enabled : docker run -d --name slater -p 7687:7687 \ -v slater-data:/data:ro -v "$PWD/acl.json:/config/acl.json:ro" \ hikarisystems/slater:latest To build the image locally instead e.g. for development : Build the image both binaries . docker compose build Serve expects generations under the slater-data volume / your /data mount . docker compose up slater Build a generation with the offline writer profile build : docker compose run --rm builder \ --input /dumps/people.cypher --graph people --data-dir /data The builder stage installs cmake , clang and libclang-dev for the rustls aws-lc-rs backend; git already in the base image is required for the hs-utils git+tag dependency, which .cargo/config.toml fetches via the git CLI. The sections below cover the on-disk format, configuration, ACLs, and a local non-Docker worked example. slater-build slater Bolt server dump.cypher ──────────▢ /data/