velesdb-memory
VelesDB is a local-first AI agent memory server that fuses vector search, graph traversal, and structured (ColumnStore) filtering into a single standalone binary — enabling durable, explainable memory with no cloud dependency.
remember— Store a fact (permanently or with a TTL) with optional structured metadata (project, author, date, etc.) and typed graph links to other memories.remember_extracted— Feed raw text; the server automatically extracts atomic facts and builds a connected fact↔topic graph with no manual linking required.recall— Retrieve memories by semantic similarity to a natural-language query, with an optional exact-match metadata filter.recall_fused— Fused vector + graph recall: finds top vector hits, then walks the graph to surface connected facts not directly mentioned in the query — ideal for multi-hop and temporal reasoning. Supports adate_fieldoption for chronological context and anowanchor.recall_where— Fused vector + ColumnStore recall with range/comparison predicates (eq,ne,lt,le,gt,ge) over metadata fields, enabling time-windowed or numeric-scoped queries.why— Explain a decision: finds the best-matching memory and returns its connected subgraph of related memories via typed links, fusing vector, ColumnStore, and graph to surface evidence that plain similarity search would miss.relate— Manually create a typed directed edge between two existing memories to build the knowledge graph explicitly.forget— Delete a specific memory by its ID.
Every AI agent today stitches together 3 databases for memory — vectors for "what feels similar", a graph for "what is connected", and SQL for "what I know for sure". That's 3 deployments, 3 configs, 3 query languages, and a pile of glue code.
VelesDB replaces all of that with a single Rust binary — smaller than a single smartphone photo.
Three things no competitor counters
🔍 It shows its work | 🔑 No cloud bill per memory | 📊 Measured, not vibes |
Ask | With the leading alternatives, every single memory saved runs 2–3 AI-model calls — by default, paid cloud calls with an API key. VelesDB stores memories with zero AI calls and zero keys: one small program (~9 MB) on your machine, no extra databases to install or operate. | We publish how often the memory finds the right information — measured with no AI grader in the loop that could flatter the score. On public test sets: +7.2 pts on multi-hop (HotpotQA) and +9.7 pts on time-scoped recall (TimeQA); on a controlled task needing both engines at once, +29 pts. Anyone can re-run the tests. |
Related MCP server: verifiable-memory
Why VelesDB?
Today (3 systems to maintain) | With VelesDB (1 binary) |
pgvector for embeddings | Vector Engine — 450us p50 end-to-end (10K/384D, WAL ON, recall>=96%) |
Neo4j for knowledge graphs | Graph Engine — MATCH clause, BFS/DFS |
PostgreSQL/DuckDB for metadata | Typed ColumnStore + secondary indexes — filtering API 130x faster than JSON scanning at 100K rows*¹ |
Custom glue code + 3 query languages | VelesQL — one language for everything |
3 deployments, 3 configs, 3 backups | ~9 MB binary — works offline, air-gapped |
¹ ColumnStore filtering API micro-benchmark, integer equality: 130x at 100K rows, 55x at 10K rows — see docs/BENCHMARKS.md § 6.
SELECT ... WHEREmetadata filtering uses secondary indexes when available, and an adaptive ColumnStore payload mirror for scan-heavy filters (see [2] below).
What is VelesDB?
VelesDB is a local-first database for AI agents that fuses three engines into a single ~9 MB binary [3]:
Engine | What it does | Performance |
Vector | Semantic similarity search (HNSW + AVX2/NEON SIMD) | 450us p50 end-to-end (384D, WAL ON, recall>=96%) [1] |
Graph | Knowledge relationships (BFS/DFS, edge properties) | Native MATCH clause |
ColumnStore | Structured metadata filtering (typed columns) | 130x faster than JSON scanning [2] |
[1] Reproduce:
python benchmarks/velesdb_benchmark.py --recall(Python SDK path, 10K/384D, WAL fsync on, i9-14900KF reference machine). See docs/BENCHMARKS.md and CHANGELOG v1.13.0. Re-verified on v3.3.0 (2026-06-24): p50 ≈ 360 µs (356–366 µs across two clean isolated runs), recall@10 0.986–0.989 on Apple Silicon — report (latency is hardware-specific; the canonical 450 µs is the i9-14900KF figure). [2] Reproduce:cargo bench -p velesdb-core --bench column_filter_benchmark. See docs/BENCHMARKS.md § 6 — at 100K rows: ColumnStore 29.5 us vs JSON scan 3.84 ms (integer equality filter). Micro-benchmark of the ColumnStore filtering API, which now servesSELECT ... WHEREmetadata filtering through a per-collection payload mirror (built adaptively for scan-heavy workloads) and backs JOIN execution; secondary indexes are used first when they cover the filter. [3] Binary size:velesdb-server, stripped release build — 9.3 MB on Apple Silicon for v3.3.0 (the v1.18.0 release artifact was 9.4 MB). Across platforms and binaries (CLI / server / migrate), release artifacts span 6–13 MB. Enforced in CI:scripts/check_binary_size.py(workflowbinary-size.yml) fails the build if a binary exceeds its ceiling.
All three are queried through VelesQL — a single SQL-like language with vector, graph, and columnar extensions:
MATCH (doc:Document)-[:AUTHORED_BY]->(author:Person)
WHERE similarity(doc.embedding, $question) > 0.8
AND author.department = 'Engineering'
RETURN author.name, doc.title
ORDER BY similarity() DESC LIMIT 5Built-in Agent Memory SDK provides semantic, episodic, and procedural memory for AI agents — no external services needed.
One binary. No cloud. No glue code. Runs on server, browser, mobile, and desktop.
Agent Memory SDK
Built-in memory for AI agents — semantic, episodic, and procedural. No external services needed.
The wedge: why() — connected memory that survives restarts
Most "agent memory" is vector recall: it finds text that looks like your query. VelesDB's high-level MemoryService adds the part that's missing — it connects memories with typed links, so it can answer why something happened by walking the graph to context that shares no words with your question. The store is on disk, so it works across sessions. Offline, deterministic, no API key, no model download:
Where Mem0 and Zep are cloud-coupled orchestrators (several backing services plus AI-model calls — cloud by default — on every memory write), this is one local binary — fully offline, zero AI calls to store a memory, and an auditable why() evidence trail. On the standard LoCoMo memory test, our fully-local setup answers 56% of the answerable questions (the benchmark's unanswerable "adversarial" category is excluded, as is standard practice — every configuration detail is disclosed) and 55–61% of time-related questions ("when did X happen?") — spanning both configurations the leading vendor's own paper reports for itself in that category, on powerful cloud AI models, while we run on a model on your own machine. Scores from different labs can't be fairly compared (the same product's score can swing ~21 points with the test setup alone), so instead of a bar chart we publish the full sourced landscape, method, and statistics. Pick it when your data can't leave the box.

from velesdb import MemoryService # pip install velesdb
mem = MemoryService("./agent_memory") # a real on-disk store; survives restarts
reason = mem.remember("Robert is recovering from knee surgery")
mem.remember("Booked the aisle seat on Robert's flight", links=[(reason, "because")])
# A *new* process, weeks later, reopens the same store and asks why:
mem.why("why the aisle seat on Robert's flight?") # walks booking → reason — recall() can'tMemories are permanent by default; forget(id) deletes one, and remember(…, ttl_seconds=…) (or a server-wide VELESDB_MEMORY_DEFAULT_TTL) gives a fact a durable, restart-surviving expiry.
The same wedge ships in Python (pip install velesdb), Node (npm i @wiscale/velesdb-memory-node), as a local MCP server, and — in-memory only, no disk access under WASM — in the TypeScript SDK (npm i @wiscale/velesdb-sdk), running entirely in the browser or Node.js with no server.
Four runnable ways to see it — each shows what plain vector recall misses and why() recovers:
Demo | What it shows |
the reason survives a process restart — recall of the top 5 of 16 memories stays blind, | |
why a magic constant has its value — a business reason that shares no words with the code | |
paste raw prose → a local model auto-wires the graph (no | |
the same engine and wedge in the Node binding |
Not a weak-embedder trick. In each retrieval demo, recall stays blind to the reason even under a real semantic embedder (
ollama/all-minilm), not just the offlinehashdefault — the reason is connected by a decision, not by surface similarity, which is exactly what a vector store cannot follow.
The context compiler: why() for your token bill
Agents burn most of their budget re-reading redundant context. The memory layer now ships a deterministic context compiler (compile_context over MCP and Node, ContextCompiler in Rust): no LLM, no cloud — duplicates drop, repeated log lines collapse with counts, code / URLs / numbers / negative constraints survive verbatim, and over-budget content becomes a recoverable ctx://source/ handle instead of a silent loss. Every decision carries a stable rule id, a reason, and a risk level (explain_compilation answers "why was this dropped?"), and the same request always compiles to the same bytes. On a committed 12-turn agent-session benchmark this measures 82.5 % real (cl100k) input-token savings with sub-millisecond stateless compiles, and 75–82 % estimated savings on the static corpus in ~2 ms (examples/context_savings, figures are local estimates, not billed tokens). The velesdb-context-optimizer skill packages the workflow — including when not to compress. See Why VelesDB.
Compiler surfaces today: MCP server, Node, Rust. Python binding: in progress — Python agents reach compile_context through the MCP server for now.
Quickstart (3 steps):
# 1. Install the MCP server binary
cargo install velesdb-memory
# 2. Point your MCP client at it (Claude Code example)
claude mcp add velesdb-memory -- ~/.cargo/bin/velesdb-memory// 3. Call compile_context — query + token_budget + fragments
compile_context { "query": "state of the canary deploy", "token_budget": 500,
"fragments": [
{ "content": "The canary is green: 2% traffic, zero errors in the last 10 minutes." },
{ "content": "Rollback runbook: kubectl rollout undo deployment/canary." } ] }
→ { "content": "…both fragments packed…", "risk": "low",
"decisions": […one auditable entry per fragment…] }No Rust toolchain? Use npm instead: @wiscale/velesdb-memory-node.
Not a transparent proxy, and no automatic indexing. The compiler only compresses what your agent explicitly hands it as fragments (logs, retrieved docs, history) — never the harness's system prompt or tool schemas, and it's the skill above that teaches an agent when/what to route through it. Every compiled fragment is content-addressed to disk under the store path so retrieve_context_source can always recover it, and aggregate savings stats are recorded — but nothing enters recallable memory (what recall / memory_scope can surface) without an explicit remember / relate / remember_extracted call. Local-first — nothing leaves the machine. Details: crates/velesdb-memory/README.md § How it works.
For the lower-level building blocks (episodic, procedural, TTL, snapshots):
from velesdb import Database, AgentMemory
db = Database("./agent_data")
memory = AgentMemory(db, dimension=384)
memory.semantic.store(1, "Paris is the capital of France", embedding)
memory.episodic.record(1, "User asked about geography", timestamp, embedding)
memory.procedural.learn(1, "answer_geography", steps, embedding, confidence=0.8)Feature | API |
TTL / Auto-expiration |
|
Snapshots / Rollback |
|
Reinforcement |
|
And because memories live in the same engine as the graph and the ColumnStore, one VelesQL statement recalls by similarity, graph context, and session — in a single query (tested end-to-end):
SELECT memory.*, similarity() FROM agent_memory AS memory
WHERE vector NEAR $embedding
AND MATCH (ctx)-[:RELATES_TO]->(fact)
AND session_id = $current_session
ORDER BY similarity() DESC LIMIT 10Full guide: docs/guides/AGENT_MEMORY.md | Source code
Quick Comparison
VelesDB | Chroma | Qdrant | pgvector | |
Architecture | Unified vector + graph + columnar | Vector only | Vector + payload | Vector extension for PostgreSQL |
Metadata filtering | Typed ColumnStore [2] + secondary indexes | JSON scan | JSON payload | SQL (PostgreSQL) |
Deployment | Embedded / Server / WASM / Mobile | Server (Python) | Server (Rust) | Requires PostgreSQL |
Binary size | ~9 MB | ~500 MB (with deps) | ~50 MB | N/A (PG extension) |
Search latency | 450us p50 (10K/384D, WAL ON, recall>=96%) | ~1-5ms | ~1-5ms (in-memory) | ~5-20ms |
Graph support | Native (MATCH clause) | No | No | No |
Query language | VelesQL (SQL + NEAR + MATCH) | Python API | JSON API / gRPC | SQL + operators |
Browser (WASM) | Yes | No | No | No |
Mobile (iOS/Android) | Yes | No | No | No |
Offline / Local-first | Yes | Partial | No | No |
Competitor latencies are typical ranges from public benchmarks and vendor documentation. Direct comparison is approximate — architectures differ (embedded vs client-server, durable vs in-memory, recall levels). Run your own benchmarks for accurate comparison.
VelesDB's sweet spot: When you need vector + graph + structured filtering in a single engine, local-first deployment, or a lightweight binary that runs anywhere.
Not the best fit (yet): If you need a managed cloud service with a multi-node distributed cluster.
Known Limitations
VelesDB is honest about its boundaries. The following are current scope limits of the source-available Community Edition — each is either a deliberate design trade-off or a feature tracked for a separate Enterprise edition. We list them here so you can make an informed technical choice.
# | Limitation | Scope | Tracked |
1 | Single writer per collection — WAL is serialized; concurrent writers contend on the same fsync lock. | Design trade-off (local-first, crash-safe by default). Read throughput is unaffected. | Concurrent WAL writer is planned for the Enterprise edition (separate product, not yet public). See docs/CONCURRENCY_MODEL.md. |
2 | No distributed replication — VelesDB is single-node. No Raft, no sharding, no automatic failover in Core. | Deliberate: the sweet spot is local-first / embedded. | Raft-based replication is tracked internally for the Enterprise edition. Contact us for timeline. |
3 | No advanced RBAC / multi-tenant isolation — The | Core ships the hook, not the policy engine. | Enterprise feature. |
4 | WASM MATCH limited to 2 hops — The browser build of | Scope of Sprint 4 item S4-13. | Tracked, not a correctness issue — native path already supports full traversal. |
5 | SIFT1M benchmark fingerprints — pinning workflow ships, sidecar not yet committed — The loader reads its pinned SHA-256 hashes from | Not a correctness issue — | One-command bootstrap shipped; sidecar commit pending first reference-machine run. |
6 | No head-to-head Docker Compose benchmark vs Qdrant / Chroma / FAISS yet — The SIFT1M benchmark (new in v1.13.0) is the standardized cross-implementation comparable number and matches the dataset used by every major ANN paper. A one-shot Docker Compose harness that runs all four systems on the same machine is deferred until the benchmark infrastructure stabilizes. | Transparency: side-by-side numbers require infrastructure we have not frozen yet. | Tracked; SIFT1M already gives comparable recall@10 numbers against the literature. |
None of the above is a correctness gap — the Community Edition is production-ready for single-node, local-first deployments. The items above are feature-scope boundaries, not bugs.
For internal technical limitations (query-planner approximations, plan cache semantics around ANALYZE, CBO integration status), see docs/reference/KNOWN_LIMITATIONS.md — each entry is tracked by a GitHub issue or documented as an explicit approximation with regression tests.
Getting Started in 60 Seconds
The fastest path is Python — under 5 seconds median, measured. (timing methodology)
pip install velesdb
curl -O https://raw.githubusercontent.com/cyberlife-coder/VelesDB/main/examples/python/hello_velesdb.py
python hello_velesdb.pyExpected output:
Query: "tech"
score=1.000 Rust 1.89 release notes
score=0.600 AI-generated jazz: the new wave
score=0.000 Best ramen in Tokyo
Query: "tech + music"
score=0.990 AI-generated jazz: the new wave
score=0.707 Rust 1.89 release notes
score=0.707 Miles Davis discographyThat's it — no server, no JSON, no embedding model. Read the 25-line script to see what happened. From here, the Agent Memory guide and the VelesQL spec are the natural next stops.
Cargo (Rust + REST server):
cargo install velesdb-server velesdb-cliDocker (REST server):
# Run the published image (multi-arch: linux/amd64 + linux/arm64)
docker run -d -p 8080:8080 -v velesdb_data:/data --name velesdb \
ghcr.io/cyberlife-coder/velesdb:latest
# Verify it's running
curl http://localhost:8080/healthPin a specific version with ghcr.io/cyberlife-coder/velesdb:3.12 (or a full
3.12.0). To build the image yourself instead: git clone the repo and
docker build -t velesdb ..
Data is stored in /data inside the container; the named volume velesdb_data persists across restarts.
Docker Compose:
git clone https://github.com/cyberlife-coder/VelesDB.git && cd VelesDB
docker-compose up -dEnvironment variable | Default | Description |
|
| Data storage directory |
|
| Bind address |
|
| HTTP port |
|
| Log level ( |
WASM (Browser):
npm install @wiscale/velesdb-wasmInstall script (Linux/macOS):
curl -fsSL https://raw.githubusercontent.com/cyberlife-coder/VelesDB/main/scripts/install.sh | bashInstall script (Windows PowerShell):
irm https://raw.githubusercontent.com/cyberlife-coder/VelesDB/main/scripts/install.ps1 | iexFirst search against the REST server (once velesdb-server is running on :8080):
curl -X POST http://localhost:8080/collections \
-d '{"name": "docs", "dimension": 4, "metric": "cosine"}' -H "Content-Type: application/json"
curl -X POST http://localhost:8080/collections/docs/points \
-d '{"points": [
{"id": 1, "vector": [1.0, 0.0, 0.0, 0.0], "payload": {"title": "AI Intro", "category": "tech"}},
{"id": 2, "vector": [0.0, 1.0, 0.0, 0.0], "payload": {"title": "ML Basics", "category": "tech"}},
{"id": 3, "vector": [0.0, 0.0, 1.0, 0.0], "payload": {"title": "History of Computing", "category": "history"}}
]}' -H "Content-Type: application/json"
curl -X POST http://localhost:8080/collections/docs/search \
-d '{"vector": [0.9, 0.1, 0.0, 0.0], "top_k": 2}' -H "Content-Type: application/json"
# {"results":[{"id":"1","score":0.994,"payload":{"title":"AI Intro","category":"tech"}}, ...]}
# Results are wrapped in {"results":[...]} and point ids serialize as strings.
# (The unified POST /query endpoint instead returns projected rows with integer ids.)Full installation guide: docs/guides/INSTALLATION.md
Vector Engine
Native HNSW index with SIMD-accelerated distance kernels. Sub-millisecond search on modern x86_64 hardware.
End-to-end search latency (canonical)
Metric | Value |
Search p50 (10K, 384D, WAL ON) | 450 us |
SIMD Dot Product (768D, AVX2) | 21.7 ns |
Recall@10 (Balanced) | 98.8% |
Quantization | PQ (8–32x, config-dependent), RaBitQ (32x), SQ8 (4x)*³, Binary (32x)*³ |
*³ Query-path compression comes from PQ and RaBitQ — both are wired end-to-end into the collection search path, restarts included. The collection-level SQ8/Binary modes maintain caches that no search path reads yet (search stays full-precision f32 — SQ8 as a collection mode therefore adds memory); their quantization primitives remain available programmatically. See docs/guides/QUANTIZATION.md.
Provenance of the canonical figures above: Intel Core i9-14900KF (x86_64, AVX2),
velesdb_benchmark.py. "End-to-end / p50" = the full production path (VelesQL → HNSW → WAL ON → payload hydration), median over the query set. "Index-only" figures (in the details below) exclude WAL and payload and run on a hot cache — they are not comparable to the end-to-end number. Per-machine figures vary; fresh Apple-Silicon measurements are given below.
5 search quality modes (Fast → Perfect), adaptive two-phase ef, AutoTune.
HNSW index-only micro-benchmark (lab-grade)
The number below is the index-only micro-benchmark (no WAL, no metadata fetch, hot cache). For the production-path number, see "End-to-end search latency (canonical)" above — 450µs p50 at 10K/384D, recall ≥ 96%.
Component micro-benchmark | Result | How to reproduce |
HNSW Search index-only (5K/768D, k=10) | 55 us |
|
SIMD Dot Product kernel (768D, AVX2) | 21.7 ns |
|
Recall@10 (Accurate mode) | 100% |
|
BM25 Sparse Search index-only (10K docs, top-10) | 57.6 us (16x from 956 us in v1.12) |
|
Cross-checked on Apple M5 Pro (ARM64 / NEON, 18-core) — measured 2026-05-31, v1.16.0
Fresh figures on Apple Silicon (single-thread, run in isolation). They confirm the engine profile and make the scope of each number explicit; they are not a substitute for the x86_64/AVX2 reference figures above.
All cargo bench commands below are run as cargo bench -p velesdb-core --bench <NAME>.
What it actually measures | Result | Bench |
HNSW search, index-only (10K/768D, k=10; no WAL/payload, hot cache) | 55 µs |
|
HNSW search scaling (top-10, index-only) | 116 µs @100K · 128 µs @500K · 129 µs @1M |
|
VelesQL engine (parse→plan→execute→project, 10K) | 41 µs |
|
End-to-end via PyO3/NumPy (10K/384D, p50; the Python production path) | 55 µs (p99 99 µs) |
|
SIMD distance, NEON (768D): dot / euclidean / cosine | 31 / 35 / 47 ns |
|
BM25 full-text search (10K, single / multi-term) | 23.5 / 71 µs |
|
Sparse search (top-10, 10K corpus) | 29.8 µs |
|
Recall@10 (n=10K/128D, exact brute-force GT; ef sweep) | ef=96 → 97.4% · ef=160 → 99.8% · ef=512 → 100% |
|
The recall figures above are
recall_benchmark's internal ef sweep (96/160/512) — distinct from the product "Modes" table below (Fast/Balanced/Accurate use ef 64/128/512). On this machine the PyO3/NumPy binding overhead is negligible: end-to-end ≈ index-only ≈ 55 µs. The 450 µs canonical figure is the i9-14900KF reference under WAL-on production conditions; per-machine results vary. Recall uses a real exact-kNN ground truth, not approximate self-comparison.
Mode | ef_search | Recall@10 | Use case |
Fast | 64 | 92.2% | Real-time suggestions, typeahead |
Balanced (default) | 128 | 98.8% | Production search, RAG pipelines |
Accurate | 512 | 100% | Evaluation, ground truth comparison |
Measurements sourced from benchmarks/results/pr363_365_comparison.md (i9-14900KF, 64 GB DDR5, Windows 11, --release, target-cpu=native). Windows micro-benchmarks carry 5-10% noise — expect a range, not a single point.
Distance Metrics
5 metrics with SIMD acceleration (AVX-512, AVX2, NEON; WASM currently uses the scalar fallback — SIMD128 kernels are planned):
Metric | What it measures | Use case | SIMD perf (768D)*² |
Cosine | Angle between vectors (direction similarity) | Text embeddings (BERT, OpenAI, Cohere), normalized vectors | 33 ns |
Euclidean | Straight-line distance (L2 norm) | Image features, spatial data, when magnitude matters | 20 ns |
Dot Product | Inner product (projection) | Pre-normalized vectors, Maximum Inner Product Search (MIPS) | 22 ns |
Hamming | Bit differences in binary vectors | Binary embeddings, locality-sensitive hashing (LSH), fingerprints | 36 ns |
Jaccard | Set overlap (intersection / union) | Sparse vectors, tag similarity, set membership | 35 ns |
² 768D vectors, AVX2 hot cache (matches the table column header), see promise-contract.json for the policed claim
-- Choose metric at collection creation
CREATE COLLECTION docs (dimension = 768, metric = 'cosine');
CREATE COLLECTION images (dimension = 512, metric = 'euclidean');
CREATE COLLECTION fingerprints (dimension = 256, metric = 'hamming');SELECT * FROM docs WHERE vector NEAR $v AND category = 'tech' LIMIT 5SIFT1M standardized ANN benchmark — measured on the de-facto-standard INRIA TEXMEX dataset (1M × 128D vectors, L2 metric). See docs/BENCHMARKS.md § 11 for methodology, dataset provenance, and how to reproduce.
Full benchmarks and methodology: docs/BENCHMARKS.md | velesdb-benchmarks repo | Quantization guide: docs/guides/QUANTIZATION.md
Graph Engine
Property graph with BFS/DFS traversal, edge labels, and Cypher-inspired MATCH queries — integrated with vector search.
-- Vector + Graph fusion in ONE statement
MATCH (doc:Document)-[:AUTHORED_BY]->(author:Person)
WHERE similarity(doc.embedding, $question) > 0.8
RETURN author.name, doc.title
ORDER BY similarity() DESC LIMIT 5Cross-collection MATCH with @collection annotation — traversal runs on the
primary collection's edge store; @collection enriches the matched node's
payload from another collection (it is not a distributed cross-graph traversal):
MATCH (p:Product@products)-[:STORED_IN]->(inv:Inventory@inventory)
RETURN p.name, inv.price, inv.stock
LIMIT 20Graph patterns guide: docs/guides/GRAPH_PATTERNS.md
ColumnStore Engine
Typed columnar storage — the same approach DuckDB and ClickHouse use. Its
filtering API is 130x faster than JSON scanning at 100K rows
(micro-benchmark: cargo bench -p velesdb-core --bench column_filter_benchmark).
JSON scan: 3.84 ms @ 100K → ColumnStore: 29.5 us @ 100K (130x faster)The ColumnStore engine backs JOIN execution and serves SELECT ... WHERE
metadata filtering through a per-collection payload mirror: top-level scalar
payload fields are mirrored into typed columns, and filters compile to
RoaringBitmap scans. The mirror is built adaptively — only after sequential
scans have cost more than one full pass — so point lookups keep their fast
path; secondary indexes are still consulted first when they cover the filter:
SELECT * FROM products
WHERE vector NEAR $query AND in_stock = true AND price < 50.0
LIMIT 10Use Cases
AI Agent Memory
Your agent needs to remember conversations, learn from mistakes, and recall relevant knowledge. VelesDB provides all three memory types in a single embedded database — no Redis, no Pinecone, no Neo4j.
memory = AgentMemory(db, dimension=384)
memory.semantic.store(1, "User prefers dark mode", embedding)
memory.episodic.record(2, "User asked about billing", timestamp, embedding)
memory.procedural.learn(3, "handle_refund", steps, embedding, confidence=0.9)RAG with Metadata Filtering
Vector search alone returns noise. VelesDB combines vector search with metadata filters (secondary indexes + planner-chosen pre/post-filtering) to eliminate irrelevant results.
SELECT * FROM docs
WHERE vector NEAR $query AND department = 'engineering' AND updated_at > NOW() - INTERVAL '30 days'
LIMIT 10E-commerce: Vector + Graph + Filters in One Query
Find products similar to a query, filter by price/stock, and traverse co-purchase relationships — all in a single VelesQL statement.
MATCH (product)-[:BOUGHT_TOGETHER]->(related)
WHERE similarity(product.embedding, $query) > 0.7
AND related.price < 200 AND related.in_stock = true
RETURN related.name, related.price
ORDER BY similarity() DESC LIMIT 20Desktop & Mobile AI
Ship AI features without a server. VelesDB embeds directly into Tauri, iOS, and Android apps.
Platform | Integration | Binary size |
Desktop (Tauri) |
| ~9 MB |
iOS (Swift) | UniFFI bindings | ~4 MB |
Android (Kotlin) | UniFFI bindings | ~4 MB |
Browser | WASM module | ~430 KB gzipped |
The Story Behind VelesDB
VelesDB was born in France out of a simple observation: EU data sovereignty is an architectural problem, not a legal one.
The US Cloud Act, FISA 702, and PATRIOT Act give US authorities multiple legal paths to reach data held by any US company — regardless of where the servers are. Hosting on AWS eu-west-1 is a latency decision, not a sovereignty decision. The EU's Data Privacy Framework has been invalidated twice (Schrems I, Schrems II), and a third challenge is pending.
For European developers building AI agents that handle health data, legal documents, or financial records, the typical 2026 stack sends embeddings to Pinecone (US), graphs to Neo4j Aura (US), and metadata to PostgreSQL on AWS (US provider). Every one of these is reachable by a FISA warrant.
VelesDB removes the US provider from the chain entirely. One Rust binary, local-first by design. No API key, no cloud account, no data processor. Your data stays in a directory you control — on your laptop, your server, your jurisdiction.
Roadmap
We ship weekly. This is the arc; the committed, dated plan lives in ROADMAP.md and the GitHub Milestones.
Line | Highlights | Status |
v1.0 → v1.18 | Core engine (vector + graph + VelesQL); Python / WASM / Mobile bindings; Agent Memory SDK; hybrid search + quantization; cross-collection MATCH; BM25 16× speedup; EXPLAIN / CBO routing; SIFT1M harness; the LangChain + LlamaIndex + Haystack Python RAG trio | ✅ Shipped |
v2.0 | Agent-memory graph dimension — | ✅ Shipped |
v3.0 → v3.2 | Major release + API cleanup; canonical cross-SDK wire primitives ( | ✅ Shipped |
v3.3 | VelesQL correctness + cross-surface parity — silent-wrong-result sweep, canonical | ✅ Shipped |
v3.4 → v3.7 | The | ✅ Shipped |
v3.8 | u64 point-id precision-safety completed across the REST surface + OpenAPI spec | ✅ Shipped |
v3.9.0 → v3.9.1 | v3.9.0: | ✅ Shipped |
v3.9.1 → v3.10.0 | Read-path gate now covers every HTTP search route (dense/text/hybrid/sparse/batch/multi-query/ids/graph-embedding/ | ✅ Shipped |
v3.11 → v3.12 (current: | Chief-engineer audit resolution (soundness, quality-gate coverage across all crates, opt-in fail-closed observer mode); pre-release hardening — WAL replay recovers writes stranded behind a corrupt frame, Python governance read-gate parity, and HNSW stores each vector once (~⅓ less resident memory on large indices). No breaking API changes. | ✅ Shipped |
Next | Concurrent WAL writer; WASM SIMD128 kernels + 3+ hop | 🔜 Tracked |
VelesDB Core is source-available (readable, modifiable, redistributable under the VelesDB Core License 1.0 — not an OSI-approved license; see docs/LICENSING.md). Enterprise features (distributed replication, managed cloud, RBAC) are available separately via VelesDB Premium.
Full Ecosystem
Domain | Component | Install |
Core | velesdb-core — Vector + Graph + ColumnStore + VelesQL |
|
Server | velesdb-server — REST API (54 endpoints, OpenAPI) |
|
CLI | velesdb-cli — Interactive VelesQL REPL |
|
Python | velesdb-python — PyO3 bindings + NumPy |
|
TypeScript | typescript-sdk — Node.js & Browser SDK |
|
WASM | velesdb-wasm — Browser-side vector search |
|
Agent memory (MCP) | velesdb-memory — local-first MCP memory server ( |
|
Agent memory (Node) | velesdb-node — in-process napi binding of the memory wedge |
|
Agent memory (TS/WASM) | typescript-sdk |
|
Mobile | velesdb-mobile — iOS (Swift) & Android (Kotlin) | |
Desktop | tauri-plugin — Tauri v2 AI-powered apps |
|
LangChain | langchain-velesdb — Official VectorStore | |
LlamaIndex | llama-index-vector-stores-velesdb — Document indexing | |
Haystack | haystack-velesdb — Haystack 2.x DocumentStore | |
Migration | velesdb-migrate — From Qdrant, Pinecone, Supabase |
|
Python RAG framework parity: VelesDB ships a first-party connector for the three major Python RAG frameworks — LangChain (
VectorStore), LlamaIndex (VectorStoreIndex), and Haystack 2.x (DocumentStore) — so you can swap VelesDB into any existing RAG pipeline with a single dependency change.
How VelesDB Works
INSERT INDEX SEARCH
┌──────────┐ upsert ┌──────────────┐ build ┌──────────────┐
│ Your App │──────────> │ WAL (append) │────────> │ HNSW Graph │
│ │ │ + mmap store │ │ (in-memory) │
└──────────┘ └──────┬───────┘ └──────┬───────┘
│ │
┌──────▼───────┐ │ search
│ ColumnStore │ filter ┌────▼─────────┐
│ (typed cols) │────────> │ SIMD Distance│
└──────────────┘ │(AVX-512/NEON)│
RESULT └──────┬───────┘
┌──────────┐ top-k ┌──────────────┐ rank │
│ Your App │<──────────│ Payload │<────────────────┘
│ │ │ Hydration │
└──────────┘ └──────────────┘Key design choices:
Local-first: In-process or single binary — no network hops, no cloud dependency
Memory-mapped storage: OS manages paging between RAM and disk
WAL durability: Every write is journaled. Crash-safe by default (
fsyncmode). Deferred sync during bulk insert for throughputColumnStore: Typed columns with string interning, RoaringBitmap tombstones, PostgreSQL-inspired auto-vacuum
# Run the published multi-arch image
docker run -d -p 8080:8080 -v velesdb_data:/data --name velesdb \
ghcr.io/cyberlife-coder/velesdb:latest
curl http://localhost:8080/health
# Or build locally / use docker-compose (builds + auto-restart)
docker build -t velesdb . && docker-compose up -dVariable | Default | Description |
|
| Data storage directory |
|
| Bind address |
|
| HTTP port |
|
| Log level |
The container runs as a non-root velesdb user. Data persists via the named volume velesdb_data. A built-in health check (GET /health) is configured with a 30-second interval.
Category | Key Endpoints |
Collections |
|
Points |
|
Search |
|
Graph |
|
Indexes |
|
VelesQL |
|
Admin |
|
Full API reference: docs/reference/api-reference.md | OpenAPI spec: docs/openapi.yaml
API Key Authentication — Bearer token auth via
VELESDB_API_KEYSenv varTLS (HTTPS) — Built-in via rustls (
VELESDB_TLS_CERT/VELESDB_TLS_KEY)Graceful Shutdown — SIGTERM triggers connection drain + WAL flush. Zero data loss
Health Endpoints —
GET /healthandGET /readyalways public
Demos & Examples
cd examples/ecommerce_recommendation && cargo run --releaseDemo | Description | Tech |
Vector + Graph + ColumnStore (5K products) | Rust | |
MCP memory server — the graph answers why a decision was made | Rust | |
PDF document Q&A with RAG | Python, FastAPI | |
Desktop RAG application | Tauri v2, React | |
In-browser vector search | WASM, vanilla JS | |
Product recommendations | Rust |
VelesDB's performance is built on peer-reviewed research — five of the six techniques below are implemented and production-active in the engine; Dual-Precision (VSAG) ships as a public API with a benchmark harness, with engine integration tracked.
Technique | Paper | Status |
HNSW | Production-active | |
VAMANA / DiskANN | Production-active (alpha pruning) | |
RaBitQ | Production-active (query path, restarts included) | |
Dual-Precision (VSAG) | Public API + benchmark; engine integration tracked | |
Software Pipelining | Production-active (search pipeline) | |
PDX Layout | Production-active (columnar layout via |
Contributing
git clone https://github.com/cyberlife-coder/VelesDB.git && cd VelesDB
cargo test --workspace --features persistence,gpu,update-check --exclude velesdb-python -- --test-threads=1Looking for a place to start? Check out issues labeled good first issue.
Powered by VelesDB
Project | Use case |
AI-powered semantic analysis to find and apply internal linking opportunities for WordPress sites | |
Your project here |
Using VelesDB in production? Open a GitHub Discussion or email contact@wiscale.fr to get featured. Your feedback shapes the roadmap.
License
VelesDB Core License 1.0 (based on ELv2). Free for production use, including commercial applications. Two restrictions: no offering VelesDB as a hosted/managed database service, and no building a competing database product. Read the full license.
Maintenance
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyberlife-coder/VelesDB'
If you have feedback or need assistance with the MCP directory API, please join our Discord server