The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the AuraSDK listing page.
Aura turns fragile prompt-only agents into auditable, memory-aware, production-ready systems
Deterministic · No fine-tuning · No cloud training · Local recall · No required embeddings
Your AI model is smart. But it forgets everything after every conversation.
Aura is a local cognitive runtime that runs alongside any frozen model. It gives agents durable memory, explainability, governed correction, bounded recall reranking, and bounded self-adaptation through experience — all locally, without fine-tuning or cloud training.
No API keys. No embeddings required. No cloud. The model stays the same — the cognitive layer becomes more structured, more inspectable, and more useful over time.
⭐ If Aura is useful to you, a GitHub star helps us get funding to continue development from Kyiv.
| Aura | Mem0 | Zep | Cognee | Letta/MemGPT | |
|---|---|---|---|---|---|
| Architecture | 5-layer cognitive engine | Vector + LLM | Vector + LLM | Graph + LLM | LLM orchestration |
| Derived cognitive layers without LLM | Yes — Belief→Concept→Causal→Policy | No | No | No | No |
| Advisory policy hints from experience | Yes — bounded and non-executing | No | No | No | No |
| Learns from agent's own responses | Yes — bounded, auditable, no fine-tuning | No | No | No | No |
| Salience weighting | Yes — what matters persists longer | No | No | No | No |
| Contradiction governance | Yes — explicit, operator-visible | No | No | No | No |
| LLM required | No | Yes | Yes | Yes | Yes |
| Recall latency | 2.68 ms uncached / 8.2 µs formatted cache hit1 | Configuration-dependent | Service-dependent | Configuration-dependent | Model-dependent |
| Works offline | Fully | Partial | No | No | With local LLM |
| Cost per operation | $0 | API billing | Credit-based | LLM + DB cost | LLM cost |
| Package size | 2.77 MB Windows CPython 3.13 wheel1 | Varies | Cloud service | Varies | Varies |
| Memory decay & promotion | Built-in | Via LLM | Via LLM | No | Via LLM |
| Trust & provenance | Built-in | No | No | No | No |
| Encryption at rest | ChaCha20 + Argon2 | No | No | No | No |
| Language | Rust | Python | Proprietary | Python | Python |
Fine-tuning costs thousands of dollars and weeks of work. RAG requires embeddings and a vector database. Context windows are expensive per token.
Aura gives you a third path: a local cognitive runtime that accumulates structured experience between conversations — free and local.
The model stays the same. The cognitive layer gets stronger. That's Aura.
Measured from the Aura 1.58.0 release wheel with 1,000 records on Windows 10,
an AMD Ryzen 5 5600X, and CPython 3.13.14. These are observations from one
local run, not latency guarantees; hardware, stored content, query shape, cache
state, enabled features, and background load all affect the result.
| Operation | Mean | Median | P95 |
|---|---|---|---|
| Store | 0.956 ms | 0.898 ms | 1.820 ms |
| Structured recall, uncached | 2.680 ms | 2.483 ms | 4.035 ms |
| Structured recall, cache hit | 0.101 ms | 0.097 ms | 0.163 ms |
| Formatted recall, cache hit | 8.6 µs | 8.2 µs | 8.7 µs |
| Repeated maintenance cycle | — | 25.68 ms | 32.62 ms |
The first maintenance cycle in this run took 487.09 ms because it processed
the newly populated store; repeated cycles had less pending work. Aura recall
uses local computation and makes no required embedding or LLM API call. No
cross-product speedup is claimed here because a valid comparison requires the
same dataset, hardware, query workload, cache state, and quality target.
Reproduce the table with:
The complete machine-readable output is stored in
benchmarks/results.json.
1 Values above are from the measured Windows build. The wheel was 2,772,715 bytes; installed size and artifacts for other Python versions and platforms vary.
Aura's full cognitive recall pipeline is active and bounded:
Record → Belief (±5%) → Concept (±4%) → Causal (±3%) → Policy (±2%)
Enable everything in one call:
Or configure individual phases:
Higher layers also expose advisory surfaced output:
get_surfaced_concepts() — stable concept abstractions over repeated beliefsget_surfaced_causal_patterns() — learned cause→effect patternsget_surfaced_policy_hints() — advisory recommendations (Prefer / Avoid / Warn)Aura also ships operator-facing and plasticity-facing surfaces:
explain_recall()explain_record()provenance_chain()explainability_bundle()capture_experience()ingest_experience_batch()mark_record_salience()get_high_salience_records()get_salience_summary()get_reflection_summaries()get_latest_reflection_digest()get_reflection_digest()get_belief_instability_summary()get_contradiction_clusters()get_contradiction_review_queue()Aura organizes memories into 4 levels across 2 tiers. Important memories persist, trivial ones decay naturally:
One call runs the lifecycle — decay, promotion, consolidation, and archival:
Aura can preserve the complete chain from evidence to a verified outcome as a small, deterministic read-model over the existing local store. It does not require a graph database, an LLM, or a cloud service:
Directed relations cover supports, refutes, contradicts, supersedes,
derived_from, recalled_for, used_evidence, used_by, caused,
produced, and verified_by. Entity status is append-only and bitemporal;
historical graph reconstruction uses both recording time and business-time
validity. Conflict recommendations are advisory and never rewrite memory.
The graph is rebuilt from reserved aura.audit.v1.* record metadata, while
links are committed atomically with Aura's existing typed connections. Compact
JSON export is available in Rust through AuditGraph::to_compact_json().
Aura's cognitive provenance explains how a memory was formed and used. The evidence substrate additionally binds an extracted claim to the exact bytes of an immutable source revision:
VerificationStatus and AnswerPermission are independent gates. A high
confidence score never overrides a changed source hash, a superseded claim, or
a blocked citation. New Record fields remain backward-compatible with older
serialized records.
Evidence-aware research reports are composed only from admitted findings. Free-form synthesis is omitted until the synthesis itself can carry claim-level lineage, preventing blocked source material from being reintroduced indirectly.
Agents can request a deterministic hot-context projection without maintaining a separate wiki or mutating memory through recall activation:
The bounded capsule prioritizes refutation scars, open evidence debt, active goals, contradictions, outcomes, decisions, and durable domain/identity records. It returns an estimated token count, omitted-record count, selection reasons, and a stable content hash. Blocked records and superseded versions outside their validity interval are never surfaced.
Semantic relevance does not guarantee that an old experience is safe to reuse in the agent's current situation. Experience records can declare hard, model-independent preconditions in metadata:
Every recalled record is annotated as use, reject, or unknown, with
matched, missing, conflicting, and mismatched fields. Aura does not filter or
rerank the results and never guesses missing state. The host agent remains in
control of whether to adapt an unknown memory. Existing recall() and
recall_structured() behavior is unchanged.
Aura can package its durable memory artifacts into one portable .aura file:
The versioned container uses independently compressed Zstd segments, bounded
sizes, a checksummed table of contents, and per-segment SHA-256 integrity.
Version 2 stores append-only generation frames: a generation becomes visible
only after its frame header is committed, so an interrupted append falls back
to the previous valid generation. Unchanged segments retain their original
offsets, removed artifacts disappear from the latest logical TOC, and a no-op
append adds no bytes. Version 1 containers remain readable; incremental append
requires a v2 container created by the current exporter.
Compaction retains the latest N committed generations with their original
generation numbers, verifies every reachable segment while rebuilding, and
replaces the old file only after the compacted container passes validation.
Unreachable payloads, dropped TOCs, and incomplete trailing frames are removed.
keep_last must be at least one; if the container already satisfies the
retention policy, compaction is a no-op. Version 1 containers must first be
restored and exported as v2 before they can be compacted.
Retained generations can be independently inspected, SHA-256 verified, read,
diffed, or restored to a new directory. Generation diffs deterministically
separate added, removed, content-changed, and unchanged artifacts.
Automatic retention combines generation-count, wall-clock age, and estimated
compacted-size limits by selecting the most restrictive contiguous suffix.
min_generations is a hard floor (default 1), and at least one maximum must
be configured. If even the minimum retained snapshot exceeds
max_size_bytes, compaction still preserves the floor and returns
size_target_met=False instead of deleting required history.
append_container_with_retention() commits the new generation first and then
applies the policy. If retention fails, the append remains valid and its error
is returned; a later policy run can safely retry cleanup.
Dry-run plans report exact keep/drop generation IDs, estimated compacted size,
active holds, and whether policy limits are blocked by a hold. Legal holds are
stored inside the container as append-only control generations and propagate
through later snapshots. Because generations form a contiguous chain, holding
generation N preserves the full suffix from N through the latest
generation. Manual compaction and automatic retention both honor that floor.
The optional background scheduler uses the same mutation lock as export,
append, compaction, retention, and hold operations, records its last run/error,
and can be stopped without waiting for the interval. Mutations are serialized
both between threads and between cooperating OS processes through an advisory
sidecar lock such as agent-memory.aura.lock. Lock acquisition times out after
30 seconds with an explicit error. The zero-content sidecar is intentionally
kept after release so that concurrent processes always address the same OS lock
object; it does not indicate that a lock is currently held. Processes that
modify .aura files without using Aura APIs must coordinate on the same lock.
Signed containers use Ed25519 over a canonical logical generation manifest:
generation metadata, legal holds, and each artifact's name, original size, and
SHA-256 digest. Physical segment offsets are excluded, so verified compaction
preserves existing signatures. Each signed manifest commits to the preceding
signed manifest digest. inspect, verify, and import reject invalid
signatures automatically; verify_container_authenticity() additionally pins
the expected public key and can require every retained generation to be signed.
An existing unsigned v2 container can start a signed epoch with a signed append,
even when no artifact changed. After that, unsigned append and unsigned hold
operations are rejected. Retention may leave the first retained signature with
a detached predecessor digest, reported as detached_prefix=True.
Keep signing private keys outside the Aura store and portable containers.
Signatures authenticate retained history but cannot by themselves detect
rollback to an older, otherwise valid signed container. For anti-rollback,
persist and compare latest_manifest_sha256 in an external trusted system.
Aura's optional authenticity checkpoint automates this comparison: it pins the
signing identity plus the highest accepted generation and manifest digest,
rejects older generations and same-generation forks, and advances atomically.
Store the checkpoint outside the Aura memory directory with trusted filesystem
permissions; deleting or modifying both the container and its checkpoint is
outside this local protection model. None of this is enabled or required for
ordinary unsigned export_container() / import_container() usage.
Extraction rejects absolute paths, traversal, duplicate names, overlapping
ranges, corruption, and existing destinations. It is an additive snapshot
format, not the live storage backend. Credential files, RBAC secrets, API keys,
and encryption key material are intentionally excluded and must be managed
separately. In Rust this support is controlled by the capsule feature and is
included in the default full build.
Context answers what an agent needs now; memory also needs to preserve which version of a fact was valid at a particular time. Aura records business-time validity separately from the system time at which a replacement was recorded:
Validity intervals are half-open: valid_from <= time < valid_until. Ordinary
recall, search, and context capsules return only records valid now; expired and
future versions remain available for audit through get(), history(),
version_chain(), and recall_as_of(). recall_at() retains its system-time
knowledge cutoff, while recall_as_of() answers the business-time question
using everything Aura knows now. Namespace isolation applies to both paths.
Supersession is committed as one durable cognitive-journal frame: the old
validity boundary, successor, and causal links either replay together or do not
apply. On startup Aura also repairs the pending marker written by older
releases after an interrupted replacement.
explain_recall() uses the same retrieval and bounded-reranking pipeline as
normal recall, but does not activate or mutate records. In addition to the
selected items and their existing score/provenance traces, it reports relevant
candidates rejected by memory gates:
Current rejection reasons are expired, not_yet_valid,
invalid_temporal_bounds, below_strength_threshold, outside_top_k, and
suppressed_by_belief_resolution. For belief competition, selected and
rejected entries expose the candidate hypothesis, winning hypothesis, both
scores, and whether the record belongs to the winning side. Rejected output is
bounded and includes omission counts. Candidate discovery is performed only
inside the requested namespace scope: records belonging to another tenant are
never represented in the trace, even by ID. The generated memory_trace_id,
selected count, and rejected count are also attached to the existing
OpenTelemetry span without logging the query or record contents.
Memory level controls retention, not truth. Aura therefore uses one governed policy for automatic reflection and promotion-candidate surfaces:
0.20 or more.0.90 strength.During maintenance, conflict and volatility are refreshed before promotion.
Explicit contradicts/conflict links form competing belief hypotheses rather
than collapsing both sides into one bucket. Hypothesis recency uses business
validity (valid_from) or creation time—not last_activated—so retrieving a
stale rule cannot make its evidence fresh again. When a belief is resolved,
the winning hypothesis is admitted to current recall and the losing side stays
available through history and explain_recall() as suppressed evidence.
Aura only resolves an explicit conflict graph as two competing sides when the
graph is one connected bipartite component. Odd cycles, multiple independent
components, isolated claims, and conflict sets without a defensible binary
topology remain Unresolved; no record receives a synthetic winning vote.
Use promotion_block_reason(record_id) to inspect why a record cannot advance.
For a genuine rule replacement, prefer supersede(..., effective_at=...); use
an explicit contradicts relationship when both claims must remain auditable
as competing evidence.
Core Cognitive Runtime
fact, decision, trend, preference, contradiction, serendipity) that influence memory behavior and insightingnamespace="sandbox" keeps test data invisible to production recallTrust & Safety
recorded, retrieved, inferred, generatedAdaptive Memory
.aura Containers — single-file, Zstd-compressed, SHA-256-verified store snapshots with restore-only safe importbrain.feedback(id, useful=True) boosts useful memories, weakens noisebrain.supersede(old_id, new_content, effective_at=...) with validity intervals and full version chainsbrain.snapshot("v1") / brain.rollback("v1") / brain.diff("v1","v2")export_context() / import_context() with trust metadataEnterprise & Integrations
store_image() / store_audio_transcript() with media provenance/metrics endpoint with 10+ business-level counters and histogramstelemetry feature flag with OTLP export and 17 instrumented spansStorageBackend trait abstraction (FsBackend + MemoryBackend)Advisory Cognitive Overlays
Explainability & Governed Adaptation
explain_recall(), including per-signal BM25 traces, plus explain_record(), provenance_chain(), and explainability_bundle()replay_recall(trace_id) reruns one of the latest 128 persisted traces and reports ranking additions, removals, moves, and score driftaudit and deny-by-default enforce modesCognitive Guidance
Without embeddings, Aura continues to use its local recall pipeline - still fast, still effective.
Use this when you need inspection-only analytics across isolated namespaces without changing recall behavior.
HTTP server:
MCP tool:
The digest is read-only. It does not bypass namespace isolation in recall and does not feed training or inference by default.
For richer operator-facing workflows, see examples/V3_OPERATOR_WORKFLOWS.md.
Aura can also observe model output and feed bounded experience back into the cognitive substrate, without retraining the model.
This stays bounded and operator-visible:
Recent operator HTTP endpoints:
GET /explain-recordGET /explain-recallGET /explainability-bundleGET /correction-logGET /cross-namespace-digestGET /memory-healthGET /belief-instabilityGET /policy-lifecycleGET /correction-review-queueGET /suggested-correctionsGET /namespace-governance-statusThe killer use case: an agent that remembers your preferences after a week offline, with zero API calls.
See examples/personal_assistant.py for the full runnable script.
Identity persists. Tasks fade. Important patterns get promoted. Like a real brain.
Give any MCP-compatible AI persistent, self-organizing memory:
Claude Desktop — Settings → Developer → Edit Config:
Cursor / VS Code — .cursor/mcp.json or .vscode/mcp.json:
macOS / Linux path:
Once connected, Claude automatically has 11 tools:
| Tool | Purpose |
|---|---|
recall | Retrieve relevant memories before answering |
recall_structured | Get memories with scores and metadata |
store | Save a fact, note, or context |
store_code | Save a code snippet at Domain level |
store_decision | Save a decision with reasoning |
search | Filter memories by level or tags |
insights | Memory health stats |
consolidate | Merge similar records |
get | Fetch a specific record by ID |
delete | Remove a record by ID |
maintain | Run a full maintenance cycle |
After connecting, tell Claude: "Before answering, always recall relevant context from memory. After our conversation, store key facts."
If cargo test intermittently fails on Windows with LNK1104 for target\debug\deps\aura-...exe, a stale test process is usually holding the file open. Run:
Then rerun the test command.
Aura includes a standalone web dashboard for visual memory management. Download from GitHub Releases.
Features: Analytics · Memory Explorer with filtering · Recall Console with live scoring · Batch ingest
| Platform | Binary |
|---|---|
| Windows x64 | aura-dashboard-windows-x64.exe |
| Linux x64 | aura-dashboard-linux-x64 |
| macOS ARM | aura-dashboard-macos-arm64 |
| macOS x64 | aura-dashboard-macos-x64 |
Try now: — zero install, runs in browser
| Integration | Description | Link |
|---|---|---|
| Ollama | Fully local AI assistant, no API key needed | ollama_agent.py |
| LangChain | Drop-in Memory class + prompt injection | langchain_agent.py |
| LlamaIndex | Chat engine with persistent memory recall | llamaindex_agent.py |
| OpenAI Agents | Dynamic instructions with persistent memory | openai_agents.py |
| Claude SDK | System prompt injection + tool use patterns | claude_sdk_agent.py |
| CrewAI | Tool-based recall/store for crew agents | crewai_agent.py |
| AutoGen | Memory protocol implementation | autogen_agent.py |
| FastAPI | Per-user memory middleware with namespace isolation | fastapi_middleware.py |
FFI (C/Go/C#): aura.h · go/main.go · csharp/Program.cs
More examples: basic_usage.py · encryption.py · agent_memory.py · edge_device.py · maintenance_daemon.py · research_bot.py
Aura uses a Rust core with Python bindings and a local-first memory runtime.
Publicly documented concepts are:
Higher cognitive layers may be present in the SDK as bounded reranking overlays and advisory inspection surfaces. They are not default runtime decision-making or behavior control.
The public repository documents the user-facing behavior and integration surface. Detailed internal architecture, tuning, and research notes are intentionally not published.
Contributions welcome! See CONTRIBUTING.md for setup instructions and guidelines, or check the open issues.
⭐ If Aura saves you time, a GitHub star helps others discover it and helps us continue development.
Built in Kyiv, Ukraine 🇺🇦 — including during power outages.
Solo developer project. If you find this useful, your star means more than you think.