The schema is written down on every write.
There is no CREATE TABLE. Each write updates a catalog of fields, types, values and links, with exact counts. When a service starts sending amount as text, the catalog shows it.
RushDB is a self-describing, graph-native database that helps AI agents reason over data with confidence: progressively introspect what's queryable—without guesswork.
Memories are ordinary records linked to the turn that produced them, so recall returns a source, not just a similar sentence. Scope them by user, agent or session with plain fields.
Each source lands in its own shape and is linked on keys it already shares, like an email or a Stripe customer ID. The agent reads the catalog first, so it knows which source holds what before it asks.
Declare text and vector indexes once and the database keeps them current as your app writes, so there is no separate search engine to sync. Filters, facets and ranking run in one query.
The agent reads real labels, fields and value counts before it writes a query, so it doesn’t invent columns. Every answer comes with its read-only query, so anyone can check the number.
Agents querying live data fail in two ways. They guess field names, types and values that don’t exist, and they can’t see what’s inside a slice of data before they narrow it. RushDB keeps an exact record of every field, type and value as data is written, and lets agents read it for all records or just the ones a filter matches.
There is no CREATE TABLE. Each write updates a catalog of fields, types, values and links, with exact counts. When a service starts sending amount as text, the catalog shows it.
Schema calls take the same filter as a records query, so fields, values and counts describe only what matched. A search page gets facet counts that agree with the results on screen, from one query document.
Filtered schema queriesSend documents as your apps and pipelines produce them. Each nested object becomes its own record, linked to its parent, in the same commit.
How ingestion worksVector and full-text indexes live next to the records and relationships, so there is no second store to keep in sync. Search, traverse and filter in one request.
ArchitectureWhen every query is checked against what is actually stored, a small open model makes up fewer values than one several times its size, and stays right after the data changes.
100×
fewer made-upfilter values
0
stale answers afterthe data changed
4.6×
more right answerson changing data
50×
fewer made-up valuesthan a 3.5× larger model
This is how an agent answers a real question on RushDB. It reads the shape of the data, filters on values that exist, then reads the shape of just the records that matched before it asks the precise question. Every field and value it uses came from the database.
enterprise is never typed as Enterprise.Why did enterprise customers cancel after the March price change?
1Read the shape
// describe
{
"kind": "schema",
"query": { "labels": ["Customer"] }
}
// query
{
"kind": "propertyValues",
"property": "plan",
"mode": "topK",
"query": { "labels": ["Customer"] }
}→Customer · 1,204 records · 38 fields
→plan: free 803 · pro 189 · enterprise 212
→canceled_at: datetime · OPENED → Ticket
2Narrow on values that exist
SELECT count(*) FROM customer
WHERE plan = 'enterprise'
AND canceled_at >= '2026-03-01'→31 customers
3Read the shape of what matched
// describe, same filter as step 2
{
"kind": "schema",
"query": {
"labels": ["Customer"],
"predicate": {
"plan": "enterprise",
"canceled_at": { "$gte": "2026-03-01" }
}
}
}→cancel_reason on 31 of 31: price 14 · missing_sso 9 · migrated 8
→OPENED → Ticket: 47 relationships
4Ask the precise question
SELECT c.cancel_reason,
count(DISTINCT c.__id) AS customers,
count(e.__id) AS tickets
FROM customer c
LEFT JOIN rushdb_edges.opened e ON e.__source_id = c.__id
WHERE c.plan = 'enterprise' AND c.canceled_at >= '2026-03-01'
GROUP BY c.cancel_reason→price 14 · 22 tickets
→missing_sso 9 · 19 tickets
→migrated 8 · 6 tickets
Open source. The engine is Apache-2.0, one Rust binary.
github.com/rush-db/rushdbNo other services to run: the engine, its indexes and its storage ship as a single binary. Native on Linux and macOS (x86-64 and arm64); on Windows through WSL 2 or Docker.
Billboardbug
Routing agents that keep their context across sessions
“Our agents and our zone grid run on 25,062+ behavioral routing trips, context that has to persist and connect, not reset every session. RushDB gives Billboardbug that memory layer out of the box. The agent remembers, so it moves.”
Ben Gauthier
Agent memoryAntifragile AI
Compliance answers that trace back to one evidence chain
“EU AI Act compliance needs more than static documents. RushDB gives Antifragile AI a graph-backed RAG layer for articles, controls, evidence, versions, and retrieval logs, so every answer can trace back to one evidence chain.”
Andrei Bâcu
Company brain & RAGSymboSystems
Autonomous operations agents that reason over business events
“Event-driven autonomous operations need memory that connects every trigger, decision, entity, and outcome. RushDB gives agents a graph-native layer for turning business events into context they can reason over and act on.”
Harsha Valluri
Agent memoryRushDB speaks the Postgres wire protocol on :5432 and Neo4j’s Bolt on :7687. Drivers, SQL clients, BI tools and agents built for them connect as they are. Everything else talks HTTP.
Connect · Postgres wire :5432 · drivers, SQL clients, BI
Connect · Bolt :7687 · graph drivers
Connect · HTTP :3000 · gRPC · services
Agents · MCP, frameworks, SDKs
Query · languages on the same data
Write
1 284 093