Embedded retrieval engine for memory-first applications.
One binary. One process. Zero network hops.
Most retrieval stacks bolt together separate services for vectors, text, and graphs — network hops, consistency gaps, and operational complexity that doesn't belong on a phone. Oneiron runs in-process as a Rust library with C FFI bindings. Every query touches a single LMDB environment with ACID transactions. Embed it on iOS, Android, desktop, or a server.
| Signal | Engine | What it finds |
|---|---|---|
| Vector | HNSW (flat NSW), SIMD-accelerated | Semantically similar content |
| Text | BM25 inverted index | Exact keywords and phrases |
| Graph | Personalized PageRank over typed edges | Relationally connected entities |
| Temporal | Bi-temporal range indexes | Events by when they happened or were recorded |
| Phonetic | Code-based posting lists | Fuzzy matches from voice/ASR misspellings |
Any subset of signals can be combined via Reciprocal Rank Fusion with per-signal boosts.
use oneiron::{Vault, VaultConfig, EntityId};
let config = VaultConfig::device();
let vault = Vault::open("./my-vault", config)?;
let id = EntityId::now();
vault.put_entity(&id, b"msgpack blob")?;
vault.put_vector(&id, &embedding)?;Install the local daemon from crates.io after publication:
cargo install oneiron-serverFrom a checkout:
cargo install --path crates/oneiron-serverOne-line install from GitHub:
curl -fsSL https://raw.githubusercontent.com/oneiron-dev/oneiron/main/deploy/install-oneiron-server.sh | shCreate and inspect the default local vault:
oneiron-server init ~/.local/share/oneiron/default
oneiron-server doctor ~/.local/share/oneiron/defaultRun the daemon:
oneiron-server serve --vault-path ~/.local/share/oneiron/defaultserve also remains the default command for the existing flags:
oneiron-server --vault-path ~/.local/share/oneiron/default --port 9090The default service vault convention is
~/.local/share/oneiron/default/. oneiron-server serve reads
~/.config/oneiron/oneiron.toml when present; file values are overridden by
ONEIRON_* environment variables and then by CLI flags.
cargo build --release
cargo nextest run -p oneiron # fast tier
cargo nextest run -p oneiron --features sync --profile full # full tier (CI parity)Tests run via cargo-nextest (cargo install cargo-nextest);
profiles and the slow-test tier live in .config/nextest.toml. Plain
cargo test still works.
ANALYZER_VERSION = "v2"changes analyzer-manifest hashes to capture Hanwhichlangrouting behavior. Existing text indexes built with older analyzer manifests must be rebuilt after upgrading; create aVaultConfig, setconfig.skip_text_index_manifest_check = true, reopen with that config, runMaintenanceBuilder::clear_text_index, reopen normally, then reindex documents.
18 LMDB databases per vault. Atomic multi-database writes via BatchBuilder. MessagePack entity blobs. Context packing into LLM-ready formats.
Full details in the design docs:
SCHEMA-DESIGN.md— database layout, key formats, encodingBUILD-PROMPT.md— architecture, algorithms, API surfaceDEPLOYMENT.md— local daemon install, config, and service templates
Apache 2.0