The full feature deep-diveLast updated · 2025

Every feature,
explained.

Five feature areas, nineteen MCP tools, one Rust binary. This page is the engineering reference — what each piece does, how it works, and the code signature you actually call.

persistent
project-scoped
semantic
local-first
MCP-native
MIT
4-bit compressed
open source
rust
offline
tree-sitter
fastembed
persistent
project-scoped
semantic
local-first
MCP-native
MIT
4-bit compressed
open source
rust
offline
tree-sitter
fastembed
01 · memory

Your agent's hippocampus,
in SQLite.

Memory is the core. biTurbo stores every remembered fact in SQLite, embeds it locally with BGE-small-en, and indexes it with turbovec. Per-project isolation means testy's decisions stay out of scout-qa's recall results — and the index never sends a byte to the cloud.

memory://recents
3 / 8 shown
#decision·testy
2h ago

Use SQLite WAL mode for concurrent agent writes

0.92
#pattern·scout-qa
5h ago

Laravel + Inertia requests need X-Inertia header on every POST

0.87
#gotcha·biTurbo
1d ago

pnpm 11 requires allowBuilds in workspace yaml for esbuild

0.78
#context·testy
2d ago

WebView inspector reads DOM via executeJavaScript sync

0.71
1,247 memories·8 projects·2ms recall

Storage layer

  • SQLite with WAL mode, r2d2 connection pool
  • Memories table with kind, importance, tags, project_id, agent_id, timestamps
  • Per-project turbovec IdMapIndex — one file per project, never shared
  • Activity audit log for every write/delete, queryable for debugging

Memory kinds

  • decision — architectural or product choices
  • pattern — recurring solutions in this codebase
  • gotcha — things that broke before and will break again
  • context — current state, in-flight work, env specifics
  • fact — verified truths about the project

Self-maintenance

  • Scheduled decay: importance * 0.95 per day, with a floor at 0.05
  • Dedup: cosine sim > 0.96 with same kind → merge into the higher-importance one
  • Merge: near-duplicates get a new embedding that's the mean
  • Configurable decay/dedup per project via INSTRUCTIONS.md rules
02 · mcp

The protocol your agent
already speaks.

MCP is the universal adapter between an LLM and a tool. biTurbo exposes 19 of them — every operation your agent needs, from 'remember this' to 'recite everything relevant to this question' — over a single stdio socket. No HTTP, no auth, no proxy.

stdio · JSON-RPC
{"jsonrpc":"2.0", "id":1, "method":"tools/list"}
{ tools: [ remember, forget, update, search, list, recall_for_context, ... ] }
remember("decide WAL mode", "testy")
search("agent auth", "scout-qa", k=8)
ingest_project("/Users/.../testy")
recall_for_context("layout bug", "testy", k=4)
consolidate("testy")
// injected into agent context
<biTurboContext project="testy">
· SQLite WAL allows concurrent reads during write
· pnpm 11 strict-dep builds need allowBuilds
· Tauri 2 webview inspect via executeJavaScript
</biTurboContext>

How it boots

  • Standalone biturbo-mcp binary, spawned by your agent's MCP config
  • Speaks stdio JSON-RPC — the official rmcp 1.7 Rust SDK
  • First call: register_agent + list_projects (auto-bootstrapped)
  • Every subsequent call scoped to a project_id

Why stdio, not HTTP

  • Zero auth surface — the OS process boundary is the only access control
  • No port to bind, no TLS to misconfigure, no firewall to argue with
  • Works in any environment Claude Code / Cursor / Cline / Mavis can spawn a process in
  • Latency: one pipe roundtrip per call, no HTTP overhead

The hot path

  • recall_for_context(query, project_id, k) returns a <biTurboContext> block
  • Pre-formatted for direct injection as system message or system prompt
  • Hybrid ranking: cosine sim + tag match + importance + recency
  • Average latency: < 2ms for k=8 on a 10k memory project
03 · graph

A force-directed map
of your codebase.

Drop a folder on a project. biTurbo walks it with tree-sitter, chunks per function, embeds each chunk, and renders a Barnes-Hut force layout in a Web Worker. 3,000+ nodes, 8,000+ edges, viewport-culled, with filter switches that cancel stale layout requests.

graph://testy/dependency
auth domain route view
3,247 nodes
8,914 edges
render < 5ms

Code ingest

  • tree-sitter 0.25 with language crates: rust, ts, js, py, go
  • Per-function chunks (not whole files) for tight semantic search
  • Respects .gitignore; configurable include/exclude globs
  • Re-ingest on demand; future: watch-folder with debounce

Layout engine

  • Barnes-Hut n-body approximation — O(n log n) instead of O(n²)
  • Runs in a dedicated Web Worker, off the main thread
  • Seed renders in < 5ms; worker refines in 200–800ms for 3k nodes
  • Filter switches cancel the active layout request via AbortController

Interaction model

  • Click a node → its neighborhood highlights, sidebar opens with chunks
  • Right-click a node → context menu: open in editor, search memories, focus
  • Pan/zoom with momentum; viewport culling keeps it at 60fps
  • Saved view states per project, shareable as a URL
04 · speed

Sub-50ms cold start.
Sub-2ms recall.

biTurbo is fast because every layer of the stack is fast. The Rust binary is ~12MB, links zero Python, and cold-starts in under 50ms. The vector index is turbovec 4-bit — 16× smaller than float32, with recall parity you can actually measure.

turbovec 4-bit · compression
16× smaller
float32
384 MB / 1M vectors
turbovec 4-bit
24 MB / 1M vectors
RAM footprint · 1M memoriescompressed
384 MB24 MB
<50ms
cold start
<2ms
recall k=8
5 langs
tree-sitter

Binary & startup

  • Pure Rust 1.77+, no Python runtime, no Docker, no JVM
  • Single ~12MB binary; release build with LTO + strip + codegen-units=1
  • Cold start < 50ms on M1, < 80ms on Intel
  • Idle RAM: ~25MB. Scales linearly with vector count, not corpus size

Vector compression

  • turbovec 0.8 IdMapIndex, 4-bit product quantisation
  • 16× smaller than float32 — 1M BGE-small-en vectors fit in 24MB
  • Recall@10 within 0.5% of float32 on MS MARCO and BEIR subsets
  • MIT licensed, beats FAISS-IVFPQ on the recall-per-byte curve

Embedding model

  • fastembed 4 with BGE-small-en (~30MB ONNX, downloaded on first launch)
  • CPU and Metal (Apple Silicon) backends; CUDA optional
  • Per-agent override possible via INSTRUCTIONS.md (e.g. bge-large for accuracy)
  • Embeddings cached by content hash; re-embed is a no-op if nothing changed
05 · open source

MIT. Forever.
No pro tier, ever.

biTurbo is, and will always be, MIT licensed. There is no enterprise edition. There is no usage-based pricing. The whole codebase is on GitHub — Rust backend, React frontend, MCP server, smoke test, the docs. Fork it, vendor it, ship it in your own product. We just ask for a star.

github.com/ltfysl/biTurbo
⭐ MIT
biturbo/
src/
·App.tsx
·store.ts
views/
·Memories.tsx
·Graph.tsx
src-tauri/
src/
·main.rs
·index_engine.rs
·mcp.rs
·consolidate.rs
·Cargo.toml
scripts/
·mcp-smoke-test.ts
·README.md
·INSTRUCTIONS.md
·LICENSE
MIT
license
Rust + React
stack
0 deps
at runtime

What's in the repo

  • src/ — React 18 + Vite + Tailwind frontend (6 views, 5 primitives)
  • src-tauri/src/ — Rust backend (db, index_engine, embed, memory, project, ingest, consolidate, mcp, scheduler, commands)
  • src-tauri/bin/biturbo_mcp.rs — standalone MCP server
  • scripts/mcp-smoke-test.ts — 19-tool validator (~2s end-to-end)

Contributing

  • Issues and PRs welcome on GitHub
  • No CLA — sign-off is the DCO (git commit -s)
  • CI runs the smoke test on every PR (coming soon — Homebrew tap first)
  • Roadmap and RFCs in the issue tracker

Roadmap (next)

  • Watch-folder ingest — auto-reindex on file change
  • Cross-encoder re-ranker for top-k (pluggable, opt-in)
  • Encrypted-at-rest mode (project-level key, Argon2id-derived)
  • Multi-device sync (CRDTs over the same on-disk format)
§ tools reference

The 19 MCP tools.

Every tool is a JSON-RPC method. Schemas below match the actual rmcp generated bindings — copy-paste safe.

categories:memorysearchprojectsystem
memory

remember

remember(content, project_id, kind?, importance?)

Persist a memory. Kind can be decision, pattern, gotcha, context, fact. Importance is 0..1 and decays over time unless reinforced.

example
remember("SQLite WAL allows concurrent reads during write", "testy", kind="decision", importance=0.9)
memory

forget

forget(memory_id, reason?)

Delete a memory. Soft-delete by default; hard-delete with reason. Logs the deletion event in the activity audit.

example
forget("mem_abc123", reason="outdated after WAL migration")
memory

update

update(memory_id, content?, importance?, tags?)

Patch any field of a memory. Updating content re-embeds automatically. Importance changes propagate to the recall ranker.

example
update("mem_abc123", importance=0.95, tags=["wal", "concurrency"])
memory

get_memory

get_memory(memory_id)

Fetch the full record of a single memory by id, including metadata, tags, timestamps, and the originating agent.

example
get_memory("mem_abc123")
search

search

search(query, project_id, k?, filters?)

Hybrid semantic + lexical search over a project. Filters: kind, tag, importance_min, time_range. Returns top-k with scores.

example
search("agent auth flow", "scout-qa", k=8, filters={"kind": "pattern"})
search

list

list(project_id, filters?)

List memories in a project with optional filters and pagination. No semantic scoring — fast, deterministic.

example
list("testy", filters={"tag": "gotcha", "limit": 50})
search

list_tags

list_tags(project_id)

Enumerate all tags in a project with usage counts. Useful for the agent to discover its own vocabulary before searching.

example
list_tags("testy")
search

recall_for_context

recall_for_context(query, project_id, k?)

The hot path. Returns a formatted <biTurboContext> block ready to inject as system context. Use this before every non-trivial answer.

example
recall_for_context("why is the layout broken on mobile", "testy", k=4)
project

list_projects

list_projects()

Discover all projects on disk. Returns id, name, vector count, last activity. Usually the agent&apos;s first call after register_agent.

example
list_projects()
project

get_project

get_project(project_id)

Fetch a single project record with full stats: memory count, vector size, ingest path, last consolidate run.

example
get_project("prj_testy")
project

create_project

create_project(name, path?)

Create a new isolated project. Path optionally binds it to a code root for auto-ingest. Index starts empty and warms on first remember().

example
create_project("testy", path="/Users/.../testy")
project

delete_project

delete_project(project_id, confirm?)

Delete a project and all its memories, vectors, audit logs. Requires confirm=true as a safety net for agents.

example
delete_project("prj_old", confirm=true)
project

ingest_project

ingest_project(project_id, path, langs?)

Walk a code root with tree-sitter, chunk per function, embed each chunk, and add as context-kind memories. Default langs: rust, ts, js, py, go.

example
ingest_project("prj_testy", "/Users/.../testy", langs=["rust", "ts"])
project

consolidate

consolidate(project_id, mode?)

Manually trigger decay/dedup/merge. mode can be 'decay', 'dedup', 'merge', or 'all'. Runs synchronously by default; async with mode='all' for big indexes.

example
consolidate("testy", mode="all")
project

consolidate_status

consolidate_status(project_id)

Inspect the last consolidate run: timestamp, memories removed/merged, scheduler next run, decay config in effect.

example
consolidate_status("testy")
system

stats

stats(scope?)

System-wide or per-project stats. scope can be 'global' or a project_id. Returns memory counts, vector sizes, recall latency p50/p95.

example
stats(scope="global")
system

bootstrap

bootstrap()

First-run helper. Returns the recommended INSTRUCTIONS.md block for the agent kind (Claude Code, Cursor, Cline, Mavis).

example
bootstrap()
system

recent_activity

recent_activity(project_id?, n?)

Stream of the last n writes (or all) for a project. Used to show the agent what its peers are doing.

example
recent_activity("testy", n=20)
system

register_agent

register_agent(name, kind)

Claim an agent identity. All subsequent writes are attributed. Kind can be claude-code, cursor, cline, mavis, or a custom string.

example
register_agent(name="claude-opus-4.5", kind="claude-code")

Give your agents
a memory.

Free. Open source (MIT). One Rust binary. Five minutes fromcargo installto your agent writing memories that survive a reboot.

~12 MB binary·cold start < 50 ms·MIT licensed·no telemetry