// Be One With Your Software

Introducing asanaDB

A TinkerPop3-compliant graph database that runs anywhere a binary can. No JVM. No heap tuning. No ceremony.

Why_asanaDB()

01. Philosophy

We believe software should be correct and simple, but never simplistic.

Infrastructure that stays out of your way means you think about your problem, not your tooling. That's the goal. Every design decision in all asanaSoft products follows from it.

02. The Case

Ditch
the JVM.

Neo4j shipped its first release in 2007. The JVM was the right call then. Graph databases have outgrown it.

Neo4j Community

  • RequiresJava 17+
  • Min heap512 MB
  • Recommended4 GB+
  • Cold start8 – 15 s
  • GC pausesunpredictable
  • Binary size~450 MB

JanusGraph

  • RequiresJava 11+
  • BackendCassandra / HBase
  • IndexElasticsearch / Solr
  • Setup time45 min minimum
  • Processes3 JVMs to start
  • Binary size>1 GB w/ deps
asanaDB

v0.19.0

  • Requiresnothing
  • Idle memory~50 MB
  • Recommendedwhatever you have
  • Cold start< 50 ms
  • GC pausesnone. no GC.
  • Binary size~5 MB

Enterprise-class graph queries
on a Raspberry Pi.

LMDB is a memory-mapped B-tree used inside OpenLDAP, the Tor Browser, and Apple Mail. It doesn't buffer — it lets the OS page cache do what the OS page cache is already great at. Reads are cache hits. There's no buffer pool to tune. There's no heap to size.

Zig compiles to native machine code with no runtime. No garbage collector means no latency spikes during traversals. What you measure in benchmarks is what you get in production.

// Verified on Raspberry Pi 4 (4GB RAM)

simple traversal, 100K nodes asanaDB

< 2 ms

same query, Neo4j Community Neo4j

won't start (OOM)

// Full benchmarks vs Neo4j + JanusGraph — coming soon

03. Products

Four tools. One Purpose: Reduce Friction.

Store your data. Access your data. Our tools are streamlined, transparent, and designed to evolve with users' growing needs. Our roadmaps are carefully planned. New features will be added because they're needed. Not because they're "neat" (though, that wouldn't hurt either! ☺️).

Core Engine

asanadb

SERVER

The graph engine. Listens for Gremlin queries over WebSocket or HTTP. Stores data in LMDB — your data directory is the entire database. Back it up with cp -r.

  • Gremlin 3.x query engine
  • WebSocket + HTTP transports
  • ACID transactions (LMDB)
  • Fleet config for multi-instance
AI MEMORY

Memory Layer

asanadb-mcp

The Model Context Protocol server. Your AI agent's persistent brain. Exposes a vocabulary of memory tools so models can read, write, and traverse their own knowledge graph.

  • Works with Claude, Gemini, any MCP client
  • Graph-structured context (not flat files)
  • memory_save / search / context / relate
  • Same binary, different subcommand

Command Line

asanadb-admin cli

CLI

Database operations from the terminal. Export to GraphSON, import from any supported format, manage licenses. Pipe it, script it, automate it.

  • asanadb graphson-export — full graph export
  • asanadb graphson-import — GraphSON NDJSON
  • asanadb csv-import / apoc-import / dataset-import
  • asanadb activate — license management

Visual Console

asanadb-admin ui

FLUTTER

Browse, query, and manage your graph visually. Live-rendered graph topology, vertex/edge inspector, Gremlin query console. Native on macOS, Windows, and Linux.

  • Live graph visualization
  • Interactive Gremlin console
  • Import / export UI
  • macOS / Windows / Linux native

04. AI Memory

Your model has amnesia.
Until now.

Every conversation starts fresh. Every context window expires. Every insight you built together evaporates when the session ends. You're not collaborating with an AI — you're briefing a new contractor every morning.

asanaDB-MCP gives your model something it has never had before: long-term memory — a persistent knowledge graph that survives context resets, spans sessions, and keeps relationships between facts, not just the facts themselves.

And short-term memory — when a new conversation starts, your model is already warmed up. It knows what you were working on, what decisions were made, and what's still open. No briefing. No recap. The conversation picks up exactly where it left off.

No markdown files. No flat JSON dumps. A graph, where every memory has edges to related memories.

// Without asanaDB-MCP

User: "Hey, where were we?"

Model: "I don't have context from previous sessions. Could you catch me up?"

// With asanaDB-MCP — new session, zero briefing

User: "Hey, where were we?"

Model: "You were finalizing the logo mockups. Design approval is still pending — that's the blocker on the white paper too. Want me to draft a follow-up to the client?"

GraphRAG. Redefined.

No corpus. No extraction.
No lossy pipeline.

GraphRAG usually means retrofitting a graph onto text that already exists — an extraction pipeline reads documents, infers entities and relationships, and reconstructs structure the source never had explicitly. That's a workaround for data that started as prose. When the agent writing the memory has direct graph access, the workaround has nothing to fix: the relationship becomes an edge the moment it's known, not a sentence a pipeline parses back out later. Same retrieval-augmented pattern — query the graph, ground the answer — without the step that loses fidelity.

Typical GraphRAG

  • Text corpus has to exist first.
  • An extraction pipeline infers entities and relationships — lossy by construction.
  • The graph is a retrieval index, rebuilt periodically as the corpus changes.
  • The model is invoked at fixed pipeline steps, not writing the graph itself.

asanaDB

  • The agent has direct graph access.
  • Relationships are edges, authored at write time — no extraction step to lose fidelity to.
  • The graph is the memory, not an index over something else.
  • The model reads and writes the graph directly, every session.

The memory vocabulary.

memory_save

Write a node with body, type, and edges to related concepts.

memory_search

Fuzzy-match across all node names. Fast enough for real-time use.

memory_context

Load a node and its neighborhood — the full relational picture.

memory_relate

Draw a typed edge between two existing nodes.

memory_hottest

Surface the nodes accessed most recently and frequently. Session continuity.

memory_save_batch

Write multiple nodes in one round trip. Efficient for bulk context saves.

Connect in three lines.

// claude_desktop_config.json

{
  "mcpServers": {
    "asanadb": {
      "command": "/usr/local/bin/asanadb",
      "args": ["mcp"],
      "env": {
        "ASANADB_NAME": "memory"
      }
    }
  }
}

Works with Claude, Gemini, and any agent that speaks the Model Context Protocol. Same config format across all clients.

05. Migration

Already on Gremlin?
Ten minutes.

asanaDB is a drop-in replacement for any Gremlin Server deployment. Your queries port unchanged. Your tooling ports unchanged. You point your application at a different address.

150,000+ rec/sec*

sustained over 12M records

253,000+ rec/sec

peak throughput

Same machine, same data: 4× Neo4j Desktop's import† on a MacBook Pro M3 18GB.

* LDBC Social Network Benchmark, 11,984,610 records, 0 errors. MacBook Pro M3 18GB RAM. WAL enabled. 4 live indexes: firstName, lastName, browserUsed, title. GraphSON / APOC not yet benchmarked. Methodology available on request.

† neo4j-admin offline bulk import on the same MacBook Pro M3 18GB: ~1.17M nodes/sec for the node pass. Not comparable: database must be offline, no indexes during load, index rebuild time not included. AsanaDB ran with WAL on, 4 live indexes, and zero downtime.

Zero ceremony

Neo4j — what you write before a single row is read

# 22 header files, one per CSV:
# header_person.csv
:ID(Person)|firstName|lastName|...|:LABEL
# header_comment_hasCreator_person.csv
:START_ID(Comment)|:END_ID(Person)
# header_forum_hasTag_tag.csv
:START_ID(Forum)|:END_ID(Tag)
# ... 19 more

AsanaDB — the entire import

asanadb dataset-import \
  --data-dir ./ldbc_data \
  --db mydb

Label inferred from filename (person_0_0.csv → Person). Relationship type inferred from edge filename pattern. No annotation files.

Import your existing data in whatever format you have it:

  • CSV Plain vertex/edge CSV files — any schema
  • GraphSON TinkerPop standard — export from Neo4j or JanusGraph, import directly
  • APOC Neo4j APOC export format — migrate in one step
  • LDBC Full LDBC Social Network Benchmark dataset directories via dataset-import — bulk load with WAL enabled and live indices

// Your existing Gremlin. No changes.

// Traverse — unchanged
g.V().has('name', 'Alice')
  .out('knows')
  .values('name')

// Pattern match — unchanged
g.V().hasLabel('Person')
  .where(out('knows').count().is(gt(5)))
  .valueMap('name', 'age')

// Single-file import (csv / graphson / apoc)
asanadb graphson-import --file export.json --db mydb
asanadb apoc-import     --file apoc_export.json --db mydb

// Bulk dataset import (LDBC / amazon / dblp)
asanadb dataset-import --dataset ldbc --data-dir ./ldbc_data

NOTE: asanaDB targets Gremlin 3.x traversal semantics. OLAP-style steps (PageRank, etc.) are not yet supported.

06. Tiers

Choose your scale.

Every tier ships as a perpetual license by default — pay once, own your binary, own your data forever. Prefer to spread the cost instead? Flip the switch below for monthly billing.

Beta pricing — subject to change at v1.0.0.

Permanent Monthly

Community

Free

perpetual license

  • asanadb server
  • asanadb-mcp (local)
  • 512 MB graph (~250K nodes)
  • Gremlin query engine
  • Admin CLI + imports
  • Remote MCP (tcp://)
  • Authentication
  • Fleet config

Developer

$149

perpetual license

  • Everything in Community
  • 2 GB graph (~1M nodes)
  • Remote MCP (tcp://)
  • SASL authentication
  • Fleet config
  • TLS
Contact_Us()

Pro

$499

perpetual license

  • Everything in Developer
  • 64 GB graph (this is not a limit)
  • Fleet config / multi-instance
  • TLS
  • Priority support
Contact_Us()

07. Visual Console

Your graph.
Alive on screen.

asanaDB Admin is a native desktop app — not Electron, not a browser tab. It speaks directly to your asanaDB server over the same ASNA protocol the MCP layer uses. No middleware, no translation layer.

Physics-simulated graph canvas, live Gremlin console, vertex and edge inspector, multi-database switching, and a dedicated Memory view for your AI agent's knowledge graph — all in one window.

Graph Canvas Physics-simulated, interactive node layout
Gremlin Console Live query execution with result streaming
Element Inspector Vertex / edge properties on click
Memory View Visualise your AI's knowledge graph
Multi-DB Switch databases without restarting
Remote Connect Connect via UDS or tcp://host:port
asanaDB Admin UI — live graph visualization and Gremlin console
asanaDB Admin UI — Live graph visualization and Gremlin console.
Console showing user interaction and node introspection from a query that returned the first twenty "post" nodes out of 1 million, that have associative edges.

08. Document Store

Have Documents?
Will Travel.

asanaDB goes where no graph database has gone before. Drop in a JSON document and it decomposes automatically — nested objects become child vertices, arrays become ordered edges, scalars become indexed properties. No schema. No migration. No ceremony. And, um, no Mongo?

Retrieve it and the graph reassembles into your original document, complete with all nested structures intact. We call it Compository — the same engine that stores it knows how to put it back together.

Because documents live in the graph, you can query across them with Gremlin. Find all Employee vertices inside a collection of Person documents. Filter by nested field. Traverse relationships between documents. asanaDB is both your document store and your graph database — at the same time.

// Store a document
{ "op": "store",
"label": "Person",
"entity": {
"_class": "Employee",
"username": "jsmith",
"dept": "Engineering"
} }
// Query it as a graph vertex
g.V()
.hasLabel('Person')
.has('_class', 'Employee')
.valueMap()
Auto-decompose Nested objects and arrays become graph structure on write
Auto-recompose Retrieve reconstructs the original document faithfully
Auto-index _id, _class, and custom key fields indexed on first write
Dual identity Label (graph category) and _class (domain type) can differ
Gremlin-native Every document is also a traversable graph vertex

Coming attraction: Because Compository understands your document's shape, it can map that shape to a typed model class. An asanaDB-backed ORM is a natural next step — write objects, query graphs, get objects back. All without leaving the database.

09. High Availability

Zero single points
of failure.

Production databases don't get maintenance windows. asanaDB replicates in real time over a simple TCP connection. When the primary goes silent, the standby promotes automatically — no operator intervention, no quorum vote, no ZooKeeper, no Raft consensus overhead.

Replication is built on the same WAL that makes crash recovery instant. The standby is always caught up. Failover is measured in seconds, not minutes.

One binary. One YAML config. Two instances. That's the entire HA story.

// normal operation

PRIMARY

:8182

● ACTIVE

WAL stream

──────▶

STANDBY

:8183

○ REPLICA

▲ clients connect here

// primary unreachable — auto-failover

PRIMARY

:8182

✗ OFFLINE

~15 seconds

── ✗ ──▶

STANDBY

:8183

● PROMOTED

▲ clients connect here

~15s

Failover time

Primary silence detected; standby promotes.

sub-ms

Replication lag

WAL shipped continuously, not on a timer.

1 field

Setup complexity

Set role: leader or follower in fleet.yaml.

Download_Admin() View_Downloads()

// 10. Binaries

Download asanaDB

v0.19.0 — server + MCP + admin CLI in one binary

DARWIN_ARM64

macOS

Apple Silicon

asanadb-v0.19.0-darwin-arm64.dmg

WIN_X64

Windows

x86_64

asanadb-v0.19.0-windows-x64.zip

LINUX_X86_64

Linux

x86_64

asanadb-v0.19.0-linux-x86_64.tar.gz

Admin UI

Visual graph browser + Gremlin console. Native app, no Electron.

macOS

AsanaDB-Admin-v0.19.0-macos.dmg

Windows

No native build yet — use the web admin UI (Chrome recommended)

launch_web()

Linux

No native build yet — use the web admin UI (Chrome recommended)

launch_web()

NOTE: The web admin UI connects to your local asanaDB instance over the browser's loopback exception for mixed content, which Chrome/Chromium (Edge, Brave, Arc included) supports reliably today. Firefox and Safari don't yet — use the native app on those platforms.

NOTE: Also available: macOS Intel (darwin_x86_64), Linux arm64 (Raspberry Pi). — request_build()