Skip to main content
Browser demo · WASM
Try playground
Embedded · Bi-temporal · Zero-egress

Private bi-temporal AI memory. Built for teams that can't use the cloud.

Kronroe is the embedded temporal graph database that keeps every fact, every change, and every uncertainty on-device or on-prem — with zero network calls and a full immutable audit trail.

Hybrid BM25 + vector retrieval, native uncertainty modelling, and eleven MCP tools — so your agents reason accurately over evolving facts.

No cloud No server No data leaves the device HIPAA / GDPR architecture
FACTS SUBJECT PREDICATE VALUE VALID TIME
every fact carries four timestamps
alice works_at @TechCorp 2023-01 →
alice works_at @Acme 2020-03 → 2022-06
alice lives_in London 2021-09 →
bob works_at @TechCorp 2022-11 →
carol lives_in London 2020-07 →
valid time — when it was true in the world
recorded — when you learned it
Viewing as of: now
2020 2022 2023 now
The design thesis

DuckDB didn't do SQLite better — it redesigned the engine for analytical workloads. Kronroe makes the same move for temporal knowledge graphs. Time isn't a feature bolted on top. It's the foundation every other capability is built on.

What does bi-temporal mean?

Every fact carries four timestamps: valid_from, valid_to, recorded_at, and expired_at. The valid-time axis tracks when something was true in the world; the transaction axis tracks when you learned it.

Normal database
alice.employer = "Acme"

You know what's true now. You don't know what was true last month. If it changes, the old value is gone. Tracking history requires separate audit tables or application-layer hacks — none of which give you consistent point-in-time queries.

Kronroe
alice works_at Acme
valid: 2023-06 → 2024-01
recorded: 2024-03-14

You know what's true, when it was true, and when you learned it. Nothing is ever deleted — history is preserved. Correct a fact and the original remains in the record, timestamped when the correction was made. Query as of any past moment.

how it works in practice →

1
Assert
graph.assert_fact("alice", "works_at", "Acme", valid_from="2023-06")

Stored with valid_from=2023-06 and recorded_at=now. Nothing is overwritten — this is the first entry in a living record.

2
Correct
graph.correct_fact(fact_id, "TechCorp") Fact forks into an expired original and a corrected replacement works_at Acme expired · works_at Acme works_at TechCorp ✓

The old fact is expired, not deleted — its expired_at is stamped. A new fact is recorded with recorded_at=now. Full audit trail preserved.

3
Query as-of
graph.facts_at("alice", at="2024-01-01")

Returns "Acme" — the truth as it was on that date, regardless of when you run the query. History is exact and immutable.

4
Query now
graph.current_facts("alice")

Returns "TechCorp" — the current state. No history was lost. Both snapshots are always available, queryable at any point in time.

Why Kronroe?

Temporal memory without the server tax

Kronroe treats time as a first-class primitive. It keeps history intact, runs on-device, and gives private apps a clearer engine for memory, search, and correction.

Core engine

Bi-temporal by design

valid_from, valid_to, recorded_at, expired_at. Query any point in real-world time or transaction time and keep the audit trail intact when facts change.

valid time
tx time
Kronroe: bi-temporal by design Graphiti: bi-temporal via Neo4j mcp-memory: no temporal model
Deployment

No server required

Single .kronroe file. No Neo4j, no Docker, no network. Runs embedded inside your app or in-browser via WebAssembly.

Kronroe: no server required Graphiti: requires Neo4j mcp-memory: serverless, but not temporal
Platforms

iOS · Android · WASM

The Rust engine ships natively across iOS, Android, Python, and WASM. Everything stays on-device, and every target shares the same storage model.

Swift Kotlin Python WASM Rust
Kronroe: iOS · Android · WASM Graphiti: desktop only mcp-memory: desktop only
Cost

No LLM required

Storage and retrieval stay engine-native, so you do not spend tokens just to remember facts.

Kronroe: no LLM required Graphiti: LLM required mcp-memory: no LLM, but less retrieval depth
Integrity

Engine-native contradiction detection

Allen's interval algebra catches conflicting facts at write time. You can allow, warn, or reject contradictions without calling an LLM.

Kronroe: engine-native contradiction checks Graphiti: LLM-based mcp-memory: none
Retrieval

BM25 + vector + hybrid search

BM25 and vector search are fused with temporal filtering, so current and historical facts stay distinct while results stay relevant.

BM25
lexical
Vector
cosine
Hybrid
RRF fused
Two-stage pipeline. Stage 1 fuses BM25 and vector scores with Reciprocal Rank Fusion (rc=60). Stage 2 reranks by temporal intent — current-state queries boost recent facts, historical queries surface point-in-time matches.
Kronroe: BM25 + vector + temporal filtering Graphiti: via Neo4j mcp-memory: embeddings only
100%
client-side engine zero network calls from Kronroe
native library size iOS · Android · WASM
4 timestamps per fact valid + transaction time

Built for teams that can't use the cloud

Kronroe is for teams that cannot move sensitive memory into a cloud service, and for apps that need private memory on device.

AI agent memory

Persistent memory for agents that need to remember how knowledge changes over time. Assert structured facts, query any point in time, and surface relevant memories with hybrid recall.

Privacy-first mobile apps

Healthcare, education, legal, and care apps get AI memory without sending sensitive records to a server. Ships for iOS, Android, Python, Rust, and WASM, and works offline when the network is not available.

MCP tool memory

Drop-in memory for Claude Desktop, Cursor, and other MCP clients. See all 11 MCP tools, then keep facts across sessions in a local .kronroe file.

Enterprise-grade privacy & compliance

Kronroe was designed from the ground up for organisations where sending sensitive data to the cloud is not an option — regulated industries, client-confidential environments, and air-gapped systems. The engine eliminates risk at the storage layer: everything stays in a single local file with zero network calls.

Architecture

True zero-egress engine

100% on-device or on-prem. No servers, no APIs, no telemetry — ever. Confirmed across every binding: Rust, iOS, Android, Python, and WASM.

Audit

Immutable bi-temporal audit trail

Every fact carries valid time + transaction time. Facts are never deleted — only invalidated. Reconstruct exactly what the system knew at any past moment.

Integrity

Contradiction detection + uncertainty model

Engine-native Allen's interval algebra catches conflicts at write time. Age decay and source authority weights let agents reason over evolving knowledge with measurable confidence scores.

Retrieval

Hybrid retrieval — no LLM required

BM25 + vector search with full temporal filtering. Two-stage RRF fusion and intent-gated reranking — completely local, no tokens spent on recall.

Safety

Memory-safe, minimal attack surface

Pure Rust, no C dependencies, no external processes. The entire engine compiles from a single cargo workspace with zero unsafe FFI in core.

Roadmap

Encryption at rest Q2 2026

Planned AES-256 / XChaCha20-Poly1305 encryption using your own master key. Data stays protected even if the device or server is physically accessed.

Who Kronroe is built for

Industry Primary use case Key regulations
Healthcare & life sciences Patient timelines, evolving clinical notes, care-home AI HIPAA, GDPR Art. 9
Legal & professional services Case memory, privilege tracking, matter evolution Attorney-client privilege, SOC 2
Financial services Transaction histories, relationship graphs, fraud patterns PCI-DSS, GDPR
Government & defence Air-gapped or classified AI agent memory Data sovereignty
Education & care Student and resident records with private AI assistance FERPA, UK GDPR
Mobile Swift (iOS) + Kotlin (Android) · ~6 MB
Desktop / on-prem Rust core + Python bindings
Web / WASM Pure browser · zero network
Air-gapped Fully offline from day one

Open source under AGPL-3.0 for community use. Commercial licences available for closed-source deployments with priority support and custom compliance features. hi@kronroe.dev

Under the hood

Pure Rust. ACID storage. No C, no network, no LLM.

Retrieval
BM25 + vector + hybrid search

Full-text search via the Kronroe lexical engine with BM25 ranking and fuzzy matching. Cosine vector search stays bi-temporal, so invalidated facts drop out of current queries but remain available for historical point-in-time lookups. Hybrid mode fuses both channels with Reciprocal Rank Fusion and a two-stage intent-gated temporal reranker. The full tool surface is documented in the MCP tools reference.

Integrity
Contradiction detection

Register predicates as singletons and Kronroe detects conflicting facts at write time using Allen's interval algebra. Conflict severity is graded by temporal overlap. Write-time policies let you allow, warn, or reject contradictions without an LLM.

Confidence
Uncertainty model

Every fact carries a base confidence score. At query time, Kronroe applies age decay and source authority weights so volatile predicates like job titles decay faster than stable ones like date of birth. The math stays in Rust and is recomputed at read time.

Storage
ACID, no C dependencies

Backed by Kronroe's native append-log storage engine with atomic fact, registry, and embedding persistence. File-backed or fully in-memory. Every fact gets a Kronroe Fact ID for lexicographically sortable, monotonic insertion order. No C dependencies, no external processes, no separate database server to manage.

Platforms
Rust, Python, iOS, Android, WASM

One engine, every platform. Use the core Rust crate directly, the PyO3 Python bindings, a Swift Package on iOS, a JNI library on Android with a Kotlin wrapper, or the WebAssembly build in-browser. Every target shares the same bi-temporal engine and ACID storage model.

Try it live

Pure Rust compiled to WebAssembly — the same bi-temporal graph engine that runs on iOS, Android, and native Rust. Every fact is stored and queried entirely inside your browser, with nothing sent to a server.

kronroe.playground — live wasm · in-browser · no server
QUICK START
1) Click a TRY chip. 2) Press Assert. 3) Enter that subject in Find and press Find.
Shortcuts: Ctrl/Cmd+K focus Find · Ctrl/Cmd+Enter submit panel
Assert fact
valid from
TRY
Find entity
at time
KNOWLEDGE GRAPH
Fact stream 0 facts
ALL
TEMPORAL RAIL
No temporal points yet. 0 visible
TIME DIFF A/B
Pick two points in time to compare state changes.
No facts yet.
Click a TRY chip or run the Time-travel demo to begin.
e.g. alice· works_at @Acme 12:34:05
ENTITY STORIES
Entity story cards appear here after facts are loaded.