| Crates.io | memvid-core |
| lib.rs | memvid-core |
| version | 2.0.135 |
| created_at | 2025-11-18 16:13:22.297503+00 |
| updated_at | 2026-01-25 19:17:35.590848+00 |
| description | Core library for Memvid v2, a crash-safe, deterministic, single-file AI memory. |
| homepage | |
| repository | https://github.com/memvid/memvid |
| max_upload_size | |
| id | 1938625 |
| size | 8,891,064 |
๐บ๐ธ English ๐ช๐ธ Espaรฑol ๐ซ๐ท Franรงais ๐ธ๐ด Soomaali ๐ธ๐ฆ ุงูุนุฑุจูุฉ ๐ง๐ช/๐ณ๐ฑ Nederlands ๐ฐ๐ท ํ๊ตญ์ด ๐ฏ๐ต ๆฅๆฌ่ช ๐ง๐ฉ เฆฌเฆพเฆเฆฒเฆพ ๐จ๐ฟ ฤesko ๐ฎ๐ณ เคนเคฟเคจเฅเคฆเฅ
Memvid is a single-file memory layer for AI agents with instant retrieval and long-term memory.
Persistent, versioned, and portable memory, without databases.
Website ยท Try Sandbox ยท Docs ยท Discussions
Memvid is a portable AI memory system that packages your data, embeddings, search structure, and metadata into a single file.
Instead of running complex RAG pipelines or server-based vector databases, Memvid enables fast retrieval directly from the file.
The result is a model-agnostic, infrastructure-free memory layer that gives AI agents persistent, long-term memory they can carry anywhere.
Memvid draws inspiration from video encoding, not to store video, but to organize AI memory as an append-only, ultra-efficient sequence of Smart Frames.
A Smart Frame is an immutable unit that stores content along with timestamps, checksums and basic metadata. Frames are grouped in a way that allows efficient compression, indexing, and parallel reads.
This frame-based design enables:
The result is a single file that behaves like a rewindable memory timeline for AI systems.
Living Memory Engine Continuously append, branch, and evolve memory across sessions.
Capsule Context (.mv2)
Self-contained, shareable memory capsules with rules and expiry.
Time-Travel Debugging Rewind, replay, or branch any memory state.
Smart Recall Sub-5ms local memory access with predictive caching.
Codec Intelligence Auto-selects and upgrades compression over time.
Memvid is a portable, serverless memory layer that gives AI agents persistent memory and fast recall. Because it's model-agnostic, multi-modal, and works fully offline, developers are using Memvid across a wide range of real-world applications.
Use Memvid in your preferred language:
| Package | Install | Links |
|---|---|---|
| CLI | npm install -g memvid-cli |
|
| Node.js SDK | npm install @memvid/sdk |
|
| Python SDK | pip install memvid-sdk |
|
| Rust | cargo add memvid-core |
[dependencies]
memvid-core = "2.0"
| Feature | Description |
|---|---|
lex |
Full-text search with BM25 ranking (Tantivy) |
pdf_extract |
Pure Rust PDF text extraction |
vec |
Vector similarity search (HNSW + local text embeddings via ONNX) |
clip |
CLIP visual embeddings for image search |
whisper |
Audio transcription with Whisper |
api_embed |
Cloud API embeddings (OpenAI) |
temporal_track |
Natural language date parsing ("last Tuesday") |
parallel_segments |
Multi-threaded ingestion |
encryption |
Password-based encryption capsules (.mv2e) |
Enable features as needed:
[dependencies]
memvid-core = { version = "2.0", features = ["lex", "vec", "temporal_track"] }
use memvid_core::{Memvid, PutOptions, SearchRequest};
fn main() -> memvid_core::Result<()> {
// Create a new memory file
let mut mem = Memvid::create("knowledge.mv2")?;
// Add documents with metadata
let opts = PutOptions::builder()
.title("Meeting Notes")
.uri("mv2://meetings/2024-01-15")
.tag("project", "alpha")
.build();
mem.put_bytes_with_options(b"Q4 planning discussion...", opts)?;
mem.commit()?;
// Search
let response = mem.search(SearchRequest {
query: "planning".into(),
top_k: 10,
snippet_chars: 200,
..Default::default()
})?;
for hit in response.hits {
println!("{}: {}", hit.title.unwrap_or_default(), hit.text);
}
Ok(())
}
Clone the repository:
git clone https://github.com/memvid/memvid.git
cd memvid
Build in debug mode:
cargo build
Build in release mode (optimized):
cargo build --release
Build with specific features:
cargo build --release --features "lex,vec,temporal_track"
Run all tests:
cargo test
Run tests with output:
cargo test -- --nocapture
Run a specific test:
cargo test test_name
Run integration tests only:
cargo test --test lifecycle
cargo test --test search
cargo test --test mutation
The examples/ directory contains working examples:
Demonstrates create, put, search, and timeline operations:
cargo run --example basic_usage
Ingest and search PDF documents (uses the "Attention Is All You Need" paper):
cargo run --example pdf_ingestion
Image search using CLIP embeddings (requires clip feature):
cargo run --example clip_visual_search --features clip
Audio transcription (requires whisper feature):
cargo run --example test_whisper --features whisper -- /path/to/audio.mp3
Available Models:
| Model | Size | Speed | Use Case |
|---|---|---|---|
whisper-small-en |
244 MB | Slowest | Best accuracy (default) |
whisper-tiny-en |
75 MB | Fast | Balanced |
whisper-tiny-en-q8k |
19 MB | Fastest | Quick testing, resource-constrained |
Model Selection:
# Default (FP32 small, highest accuracy)
cargo run --example test_whisper --features whisper -- audio.mp3
# Quantized tiny (75% smaller, faster)
MEMVID_WHISPER_MODEL=whisper-tiny-en-q8k cargo run --example test_whisper --features whisper -- audio.mp3
Programmatic Configuration:
use memvid_core::{WhisperConfig, WhisperTranscriber};
// Default FP32 small model
let config = WhisperConfig::default();
// Quantized tiny model (faster, smaller)
let config = WhisperConfig::with_quantization();
// Specific model
let config = WhisperConfig::with_model("whisper-tiny-en-q8k");
let transcriber = WhisperTranscriber::new(&config)?;
let result = transcriber.transcribe_file("audio.mp3")?;
println!("{}", result.text);
The vec feature includes local text embedding support using ONNX models. Before using local text embeddings, you need to download the model files manually.
Download the default BGE-small model (384 dimensions, fast and efficient):
mkdir -p ~/.cache/memvid/text-models
# Download ONNX model
curl -L 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/onnx/model.onnx' \
-o ~/.cache/memvid/text-models/bge-small-en-v1.5.onnx
# Download tokenizer
curl -L 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/tokenizer.json' \
-o ~/.cache/memvid/text-models/bge-small-en-v1.5_tokenizer.json
| Model | Dimensions | Size | Best For |
|---|---|---|---|
bge-small-en-v1.5 |
384 | ~120MB | Default, fast |
bge-base-en-v1.5 |
768 | ~420MB | Better quality |
nomic-embed-text-v1.5 |
768 | ~530MB | Versatile tasks |
gte-large |
1024 | ~1.3GB | Highest quality |
BGE-base (768 dimensions):
curl -L 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/onnx/model.onnx' \
-o ~/.cache/memvid/text-models/bge-base-en-v1.5.onnx
curl -L 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/tokenizer.json' \
-o ~/.cache/memvid/text-models/bge-base-en-v1.5_tokenizer.json
Nomic (768 dimensions):
curl -L 'https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/resolve/main/onnx/model.onnx' \
-o ~/.cache/memvid/text-models/nomic-embed-text-v1.5.onnx
curl -L 'https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/resolve/main/tokenizer.json' \
-o ~/.cache/memvid/text-models/nomic-embed-text-v1.5_tokenizer.json
GTE-large (1024 dimensions):
curl -L 'https://huggingface.co/thenlper/gte-large/resolve/main/onnx/model.onnx' \
-o ~/.cache/memvid/text-models/gte-large.onnx
curl -L 'https://huggingface.co/thenlper/gte-large/resolve/main/tokenizer.json' \
-o ~/.cache/memvid/text-models/gte-large_tokenizer.json
use memvid_core::text_embed::{LocalTextEmbedder, TextEmbedConfig};
use memvid_core::types::embedding::EmbeddingProvider;
// Use default model (BGE-small)
let config = TextEmbedConfig::default();
let embedder = LocalTextEmbedder::new(config)?;
let embedding = embedder.embed_text("hello world")?;
assert_eq!(embedding.len(), 384);
// Use different model
let config = TextEmbedConfig::bge_base();
let embedder = LocalTextEmbedder::new(config)?;
See examples/text_embedding.rs for a complete example with similarity computation and search ranking.
The api_embed feature enables cloud-based embedding generation using OpenAI's API.
Set your OpenAI API key:
export OPENAI_API_KEY="sk-..."
use memvid_core::api_embed::{OpenAIConfig, OpenAIEmbedder};
use memvid_core::types::embedding::EmbeddingProvider;
// Use default model (text-embedding-3-small)
let config = OpenAIConfig::default();
let embedder = OpenAIEmbedder::new(config)?;
let embedding = embedder.embed_text("hello world")?;
assert_eq!(embedding.len(), 1536);
// Use higher quality model
let config = OpenAIConfig::large(); // text-embedding-3-large (3072 dims)
let embedder = OpenAIEmbedder::new(config)?;
| Model | Dimensions | Best For |
|---|---|---|
text-embedding-3-small |
1536 | Default, fastest, cheapest |
text-embedding-3-large |
3072 | Highest quality |
text-embedding-ada-002 |
1536 | Legacy model |
See examples/openai_embedding.rs for a complete example.
Everything lives in a single .mv2 file:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Header (4KB) โ Magic, version, capacity
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Embedded WAL (1-64MB) โ Crash recovery
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Data Segments โ Compressed frames
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Lex Index โ Tantivy full-text
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Vec Index โ HNSW vectors
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Time Index โ Chronological ordering
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ TOC (Footer) โ Segment offsets
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
No .wal, .lock, .shm, or sidecar files. Ever.
See MV2_SPEC.md for the complete file format specification.
Have questions or feedback? Email: contact@memvid.com
Drop a โญ to show support
Apache License 2.0 โ see the LICENSE file for details.