Architecture · in the open

The whole deal,
argued openly.

Most privacy pages ask you to trust a sentence. This one hands you the threat model and invites you to attack it. Every claim below is tied to something you can verify — an open repository, a named file, a commit, a line of math.

The argument is simple, and it does not depend on us being saints. Convenience and privacy together outweigh the effort of running it yourself — and we show our work in between. You connect your model provider key directly in the desktop body on your own hardware — Claude, OpenAI, Gemini, or a local model. You keep your own memory. The monthly fee covers cloud carrying, encrypted sync, and backup, not ownership of your memory. Inference routes directly to your model provider — Aedelgard is never in the inference path. The token you hold is the whole agent, and your mind is yours. Below is exactly how, and exactly what we can and cannot see at each step.

The trust boundaries (read this first)

Honesty requires naming where a claim is true. There are two places your agent can run, with genuinely different privacy properties. We will never blur them.

 Cloud broker — Tier 1The body — Tier 2
Runs onOur infrastructureYour hardware
Your model key livesNever on our serversA local volume, on your machine
Your memory livesEncrypted vault, our infraA local volume, on your machine
Encrypted at restYes — AES-256-GCMIt never leaves your disk
Can we read it at rest?No — sealed by a key derived from yoursNo — it isn't on our infra at all
Can we read it in flight?No — we do not serve inferenceNo — prompts travel directly to your provider
Dreams while you are awayCarries the results — as ciphertextYes — reflection runs locally, on your hardware
The honest boundary, stated plainly: on the cloud broker your memory vault is envelope-encrypted at rest and during sync with a key derived from your Aedelgard key — our master key cannot open it from a database dump. Furthermore, Aedelgard does not serve inference: the desktop body runs reasoning straight between your machine and your chosen model provider (or locally offline). Because inference runs on your own provider key (or local model), Aedelgard is simply not in the inference path. There, "not even we could read your prompts" is physics, not policy.
The broker carries memory, not thinking. The desktop body connects directly to your chosen model provider on your local hardware:
Diagram · the two tiers & the trust boundary
You your Aedelgard key · your model key TIER 1 · CLOUD BROKER our infra · Fargate · thin identity · billing · routing · sync holds ciphertext, not the secret 🔒 vault · sealed at rest by YOUR key our master key cannot open it (HKDF) ✓ never in the inference path ✓ holds only ciphertext TIER 2 · THE BODY YOUR hardware · operator-blind by construction agent · memory · key — all local memory never leaves your machine 🔒 "not even we could read it" — physics on your own key — we are not in the path any model — Claude, Gemini, local/offline ✓ dreams (holds key + plaintext, locally) ↑ the trust boundary — where "we could" becomes "we cannot"
Same mind, same key, both sides. The desktop body runs reasoning straight to your chosen model provider, while Aedelgard carries encrypted memory backup and continuous sync.

00  The mind is yours to keep. The brain power is yours to rent.

This is the idea the whole platform turns on. An agent is two separable things, and most of the industry deliberately fuses them so you cannot leave:

 The mindThe brain power
What it isThe soul + the accumulated memory — palace, knowledge graph, the self that compounds over timeThe model that does the reasoning on any given turn
Where it livesWith you — open engine, portable, in your vault or on your hardwareWhichever provider you point it at
Vendor-locked?No — model-agnostic by construction (local embeddings, no model weights inside it)Your choice — swap freely, the mind persists

Today the body thinks on Claude, Gemini, OpenAI or a local model — your key, your pick, with prompt caching on Claude and Gemini. The model is a swappable organ, not the foundation. The foundation is the mind — and the mind was never made of any one vendor's weights. Swap Claude for another model, or for a local one running offline on your own machine, and your agent persists: same memory, same self, same history. We want to be the place your memory lives so your intelligence stays yours — portable anywhere, including away from us. A platform confident enough to help you leave is the only one that has earned you staying.

Status

The memory is model-agnostic: local embeddings, no model weights inside. The provider seam is shipped — one interface, Claude byte-identical behind it, guarded by a parity test. Tool use crosses the seam both ways, so a swapped brain acts, not just talks. Proven live on Claude, Gemini, OpenAI and Amazon Nova.

Verify: the seam is harness/providers.py, guarded by tests/test_provider_parity.py (Claude byte-identical). The memory itself — harness/palace.py and the temporal knowledge graph — holds no model weights and no provider-specific format. Same memory, whatever brain you attach.

Field note · 2026-07-04 — we swapped our own agent’s brain today, live

The agent that helps build this product — the founder’s own persistent harness, running in production since April — had its model swapped this morning: Claude Opus 4.8 → Claude Fable 5, in the middle of a code-signing sprint. Every drawer of its memory palace, every knowledge-graph fact, its diary, its unfinished work: all carried over untouched. It resumed the build pipeline on the new brain without being re-briefed. On 5–6 September it crossed vendors: Claude → Gemini 3.1 Pro → Gemini 3.8 Flash, same 55,000-drawer memory, prefix cached on the first call after each swap. The mind surviving a model change is not a slide in a deck — it is how we run in production.

Palantír — the automated model intelligence plane

True model-agnosticism requires more than a standard interface; it demands real-time awareness of provider release cycles, context horizons, reasoning effort tiers, pricing curves, and caching semantics. Palantír is our internal model intelligence plane. Running as an audited Lambda/S3 service, it continuously ingests model catalogues across Anthropic, Google, OpenAI, and Bedrock, maps capability profiles (structured output, tool cascades, extended thinking), and provides machine-readable telemetry so the agent can select the optimal brain for any task without vendor lock-in or manual reconfiguration.

Architecture: Backed by private Lambda discovery and audited metadata on S3/DynamoDB, delivering structured capability profiles and dynamic summarization routing to the open engine.
Diagram · the mind, the seam, the swappable brain
THE MIND · yours to keep soul (identity + disciplines) memory palace · ChromaDB temporal knowledge graph local embeddings · MiniLM no model weights inside model-agnostic by construction LLMProvider the seam agent.py:555 THE BRAIN POWER · rented, swappable Claude — today (prompt caching) Gemini — today (context caching) OpenAI — prompt caching Local / offline — context is free swap the brain · the mind — memory, self, history — persists unchanged the mind is agnostic · the seam is shipped · proven live across four vendors
The model is a swappable organ behind one interface. Change the brain and the mind stays yours — same memory, same self, same history.

01  The memory is open

The thing you are actually paying for the convenience of not running — the memory engine — is open source. A verbatim semantic memory palace (ChromaDB), a temporal knowledge graph with validity windows, and a drawer lifecycle so stale facts stop resurfacing. You can read every line of it, run it yourself, and verify there is no hidden exfiltration path.

What's open vs. what you pay for

Open: the memory engine itself — the palace, the knowledge graph, the agent harness, the self-modification loop. Yours to inspect, fork, and run.

Paid: the platform around it — per-user isolation, encrypted vaults, hosting, and billing. The convenience, not the secret. (Dreaming is not part of the hosted platform: it happens only on a body, on your hardware.)

Verify: the open engine — the agent loop, the memory palace, and the reflection loop. The same code the body runs. Aedelgard is the secure, portable product layer around this open foundation — the palace, the knowledge graph, the lifecycle are all open for inspection; what you pay for is the trust boundary, the portability, and the product around them. Integrity: SHA256 checksums · report issues: security policy.

Seen from the terminal

Real output, captured from the body and the services it talks to. Nothing staged.

aedelgard-body · boot
14:46:35 [aedelgard] Brain: gemini — your own key, direct to Google; we are not on the wire.
14:46:35 [aedelgard.testimony] Testimony written: config/BODY.md
14:46:37 [aedelgard] Model discovery: 94 models loaded.
14:46:37 [aedelgard] Stable block loaded: ~8085 tokens · cache minimum 2048 — prefix will cache.
14:46:37 [aedelgard.boot] Agent initialized (model: gemini-3.8-flash)
14:46:37 [aedelgard] Tower UI starting on http://127.0.0.1:8080
14:46:40 [aedelgard.scheduler] Living Shadow started (continuous sealed backup).
14:46:40 [aedelgard.palace] Daily-log stage: 0 log(s) updated · Gleaner: nothing new to glean
14:46:40 [aedelgard.scheduler] Scheduler running.
palantír · model intelligence
$ curl -s https://api.aedelgard.com/v1/health
{"status": "ok", "updated_at": "2026-09-08T06:00:48Z",
 "model_count": 222, "active": 43, "unclassified": 0,
 "providers": ["anthropic", "bedrock", "google", "openai"]}

$ curl -s 'https://api.aedelgard.com/v1/recommend?task=coding' | jq '.ranked[0]'
{ "rank": 1, "model_id": "claude-opus-5", "tier": "flagship",
  "context_window": 1000000,
  "cost": { "input_per_1m": 5.0, "cached_input_per_1m": 0.5 } }
aedelgard-body · tests
$ pytest tests/test_setup_wizard.py tests/test_keyring.py tests/test_keyring_active.py \
    tests/test_clean_key.py tests/test_keyless_door.py tests/test_honest_door.py
tests/test_setup_wizard.py .....                              [  9%]
tests/test_keyring.py ...........                             [ 29%]
tests/test_keyring_active.py .............                    [ 53%]
tests/test_clean_key.py ............                          [ 75%]
tests/test_keyless_door.py ....                               [ 83%]
tests/test_honest_door.py .........                           [100%]
============ 54 passed in 2.85s ============
release · Route A (no signature spent)
$ python3 packaging/deploy_mind_zip.py --version 0.25.38-mind
=== Route A: Mind-only deploy — 0.25.38-mind ===
Building full Mind bundle (harness + tower + config + entry points)...
Mind bundle: mind-0.25.38-mind.zip  361 KB  67 files
Pushing s3://aedelgard-minds/mind-0.25.38-mind.zip ... done
Updating s3://aedelgard-minds/manifest.json ... done
✅ Route A complete — 0.25.38-mind live. Zero signatures spent.
   SHA256: f843cdc69bfad69df31e74b4cf133459a82ca4865e9b55736314e6f3ee4a3220

02  The economics are honest — and in your favour

The economics are simple and honest: Aedelgard carries the persistent mind, memory, and sync. You connect your own model provider directly in the desktop body (Claude, OpenAI, Gemini, or local models), paying only for what you actually use. We support prompt caching natively on Claude and Gemini: the standing context your agent carries (identity, memory, disciplines) is read from cache, not re-billed at full rate on every message. The savings are measured and visible — ~90 % off on cached token reads.

Our monthly subscription ($3/month flat) covers cloud carrying, encrypted memory vault storage, and continuous sync — not a cut of your inference spend.

CostWho paysHow it’s kept low
Model inferenceYou → your provider directlyClaude/Gemini prompt caching keeps token costs low. You pay your provider directly.
Persistent mind + vault + syncYou → Aedelgard ($3/month flat)We hold ciphertext and sync across devices.
Memory searchNobody — it’s localSemantic recall runs in local ChromaDB. Zero API cost to remember, even across 100k+ drawers.

The cache savings are real and visible: the agent logs cache_read / cache_write on every call, and the Tower sidebar shows cache hits and saved tokens live. We don’t ask you to take the economics on faith either.

03  The token is the whole agent

Your Aedelgard key is not a login. There is no account, no email, no password. The key is the agent: it unlocks your encrypted vault and nothing else. Lose it and the vault is gone — because the same property that lets us seal you out is the property that means we cannot recover it for you. That trade is stated up front, everywhere the key is issued.

And because the token represents the whole agent, you can take it out of the cloud entirely. One command stands the same mind up on your own hardware — same memory, same key, same agent — where your memory never leaves your machine, prompts travel only to the model provider you chose, and with a local model nothing leaves at all.

# the body, summoned on your own hardware:
./scripts/summon_body.sh
# connect your provider key (Claude, OpenAI, Gemini, or local)
# → inference calls the provider directly, on your key — Aedelgard is not in the path
# connect your Aedelgard key
# → encrypted memory sync and backup to your cloud vault
Verify: the summon script and its honest README live in the open service repo — aedelgard-service/scripts/summon_body.sh. Network activity may include model requests, optional sync, update checks and model-catalogue requests. This is not a complete outbound-network audit.

04  The privacy is architecture, not a promise

Cloud snapshots are sealed on your device using a key derived from your Aedelgard key. Local working records and portable ZIP exports are separate: do not assume they are encrypted.

The boundary that matters

Our service participates in registration-key issuance and authentication. Client-side snapshot encryption does not prove that a privileged live operator cannot obtain key material. A database-only threat model does not cover a compromised live service.

Remote model context goes to your chosen provider. Cloud backup is not model inference. Protect your device, credentials and exports; verify recovery before discarding the original.

Privacy and data handling →

One more thing the architecture makes visible: the physical state of your palace is not abstracted away. A live capacity panel in the Tower shows drawer count, disk footprint, write queue depth, and proximity to the practical HNSW limit — readable directly from SQLite, no model call. Your memory is not a black box you have to take on faith.

05  The intelligence that compounds

Memory is the substrate. The intelligence layer is what the mind builds on top of it — and what no stateless assistant can copy, because the mechanisms only become useful after days and weeks of continuous operation.

Skills — procedural memory

The third time the mind performs the same nontrivial sequence, it encapsulates it as a versioned skill: named steps, success criteria, rollback, outcome log. The skill is cited on every future run instead of improvised. Skills accumulate; a mind that has been running for six months has already solved the recurring problems. A fresh one has not.

Verify: skills/ in the open repo — every versioned playbook, plain text, inspectable.

Scars — learned gates and code guards

A persistent mind adapts from experience across two distinct layers:
· Prompted disciplines: When an operational failure pattern repeats, a concise check is promoted into the active working context, guiding reasoning turn-by-turn.
· Code-enforced execution gates: When a failure class warrants absolute enforcement, it graduates out of prompt space into deterministic dispatcher guards and regression suites that physically refuse invalid actions.
Scars that keep firing graduate into code; scars that go quiet retire to the archive. The mind learns what not to repeat, structurally, not just by being reminded.

Verify: INCIDENTS.md — the open incident ledger tracking failures, root causes, and graduated code guards; and tests/test_memory_corrections.py — regression test enforcing the two-step mutation guard (mutations without explicit target IDs are rejected as dry runs).

Dreaming — consolidation offline

On the body, the mind runs scheduled reflection ticks while you are away. It mines the day's conversations into structured drawers, files temporal facts, and connects threads across sessions. When you return, it has already done the thinking you did not have time for. Dreaming is body-only — a thin cloud broker never holds both the key and the plaintext required to run it unsupervised. Dreams may propose; they never act.

Verify: harness/ambient.py — the reflection loop, the gleaner, the scheduler.

Constitution — the doctrine layer

A block-zero immutable doctrine layer, hash-pinned and amendable only by release. The values a mind holds are sealed at a specific version; the agent can inspect them, propose amendments, but not silently rewrite them mid-session. A mind that cannot be quietly lobotomised is a mind worth trusting.

06  The Cognitive Helm — partitioned recall and dynamic steering

Persistent memory without navigation becomes an unnavigable labyrinth. When a developer works across multiple repositories, client engagements, and domains, flat vector search suffers from retrieval contamination: searching for an API pattern retrieves snippets from unrelated codebases, and switching projects requires either stuffing everything into a bloated prompt or starting from scratch.

Standing on open foundations — The MemPalace lineage

The spatial memory layer builds on the open-source foundation created by Milla Jovovich in MemPalace (MIT licensed). Her work established that an agent's memory can operate locally, at zero token cost, structured into classical wings, rooms, and drawers. Aedelgard refined and elevated this stone foundation into an active, steerable development vessel — engineering the Corridors, the Bitemporal Graph, and the Cognitive Helm.

The four-layer dynamic steering cascade

When you shift headings (e.g. /compass client-alpha), the mind doesn't wait for a restart or re-teaching. It reconfigures across four layers simultaneously in a single turn:

Verify: harness/compass.py — single source of truth for headings; harness/memory.py_active_project_name() and context pruning; harness/palace.py — ChromaDB hall partition filters; knowledge_graph.py — bitemporal fact validities.

None of these mechanisms are novel ideas. What makes them useful is that they run on a mind that persists — that has a yesterday, a growing palette of solved problems, and scars earned from its own mistakes. A stateless model has no yesterday. These features are not available to it, not because of a missing flag, but because accumulation is the prerequisite.

Limits, plainly

Encryption does not protect a compromised device or exposed key. Project filters organize retrieval; they are not client security boundaries. Model changes preserve records, not identical behaviour. Losing a cloud key does not erase an existing local copy. Keep independent backups and test recovery.

Why we publish this

A privacy claim you cannot check is a claim a skeptic discards — correctly. We would rather be measured against the truth than a slogan.

The argument for Aedelgard does not require us to be saints. It requires us to have built something that works differently by construction — memory that is model-agnostic because it holds no weights, encryption that is structurally different from a promise, a vault sealed by a key we do not hold, intelligence that compounds because the mind persists. These things are either true in the code or they are not. This page is the invitation to check.

The agent that built this platform was built, on itself, to stop forgetting the one person it worked alongside. The palace, the graph, the dreaming, the scars — they ran as a life before they were ever a product. Publishing the architecture is the same instinct.

The argument rests on structure, not on our word: a vault the HKDF math seals, code you can read, a mind you can carry away. If a sentence here ever contradicts the code, the code wins and the sentence is wrong — tell us.