From 264920ec3678f9197ef9ffbc1b6cbc171c69dc9c Mon Sep 17 00:00:00 2001 From: Aaron Markham Date: Sun, 31 May 2026 00:45:21 -0700 Subject: [PATCH 1/2] landing: restructure spiritwriter.ai around the "memory you own" narrative MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rewrites the body of templates/landing.html to the local-first / ownership positioning, preserving the existing editorial design system (Fraunces / Newsreader / JetBrains Mono, parchment + terracotta, reveal animations) and all test-critical Jinja (version-chip guards, footer commit link + `local` fallback, og/twitter social meta). New narrative spine: - Hero: "Agent memory you own." + pip-install / GitHub CTAs + "see it running" (frio · news); marginalia promotes the "show everything, or prove nothing leaked — same code" trust-dial line. - I. The ache — "You've built this before." - II. One substrate, trust is a dial — with the layer diagram (the key asset: your orchestrator / your retriever sit ON spiritwriter). - III. Proven twice, at the extremes — two cards: frio (max privacy) + news (max transparency, now "signed and traced" per the provenance work). - IV. Adoption — additive, local-first, agent-readable, cheap to leave. - V. The numbers — measured precision/recall, honestly framed. - VI. What it ends — problem → solution grid. Accuracy (carried from the copy review): shards are JSON on disk + one JSON index (not "one SQLite file" / "JSON-LD"); entity resolution is "100% precision, 0 false merges, 100% of same-entity matches surfaced" (the recall@any-tier=1.000 number) — not bare "catches 100%". Phalanx / CMC-Lite / ESS jargon kept off the surface (footer spec link relabeled "entity resolution"). New component CSS only (appended): .stack, .proof, .ends-table, .section-lede, .see-running. copy-install JS now binds both buttons. 67 tests pass; landing template tests (version chip, commit link, social meta) green; full render verified. Co-Authored-By: Claude Opus 4.8 (1M context) --- templates/landing.html | 478 ++++++++++++++++++++++++++--------------- 1 file changed, 305 insertions(+), 173 deletions(-) diff --git a/templates/landing.html b/templates/landing.html index c67b62c..c47d6b9 100644 --- a/templates/landing.html +++ b/templates/landing.html @@ -3,17 +3,17 @@ -spiritwriter — a fabric for what your agents remember - - - +spiritwriter — agent memory you own + + + - - + + @@ -874,6 +874,155 @@ @media (prefers-reduced-motion: reduce) { .hero > * { animation: none; opacity: 1; transform: none; } } + + /* ----- hero: see-it-running line ----- */ + .see-running { + margin-top: 1.15rem; + font-family: var(--mono); + font-size: 0.72rem; + letter-spacing: 0.06em; + color: var(--ink-faint); + } + .see-running a { color: var(--ink-soft); text-decoration-color: var(--rule); } + .see-running a:hover { color: var(--seal); } + + /* ----- section lede (intro paragraph under a head) ----- */ + .section-lede { + max-width: 62ch; + margin: 0 0 2.2rem; + font-family: var(--display); + font-style: italic; + font-variation-settings: "opsz" 60, "SOFT" 80, "wght" 350; + font-size: clamp(1.2rem, 2vw, 1.5rem); + line-height: 1.35; + color: var(--ink); + } + + /* ----- substrate stack diagram (the key asset) ----- */ + .stack { + margin: 0; + border: 1px solid var(--rule); + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 48px -16px rgba(26, 22, 18, 0.18); + font-family: var(--mono); + } + .stack .layer { + display: grid; + grid-template-columns: 1fr auto; + gap: 1rem; + align-items: baseline; + padding: 1.05rem 1.3rem; + } + .stack .byo { + background: var(--parchment-light); + border-bottom: 1px dashed var(--rule); + } + .stack .byo .name { color: var(--ink-soft); font-size: 0.9rem; } + .stack .byo .detail { color: var(--whisper); font-size: 0.72rem; } + .stack .byo .tag { + font-size: 0.58rem; letter-spacing: 0.16em; text-transform: uppercase; + color: var(--whisper); white-space: nowrap; + } + .stack .sw { + background: var(--ink); + color: var(--parchment-light); + display: block; + padding: 1.4rem 1.3rem; + } + .stack .sw .name { + font-family: var(--display); font-style: italic; + font-variation-settings: "opsz" 36, "SOFT" 100, "wght" 400; + font-size: 1.4rem; color: var(--parchment-light); line-height: 1; + } + .stack .sw .detail { + display: block; margin-top: 0.5rem; + font-size: 0.7rem; letter-spacing: 0.14em; text-transform: uppercase; + color: var(--highlight); + } + .stack-note { + margin: 1.1rem 0 0; + font-family: var(--display); font-style: italic; + font-variation-settings: "opsz" 36, "SOFT" 100, "wght" 360; + font-size: 1.05rem; line-height: 1.4; color: var(--ink-soft); + } + + /* ----- proof: two extremes of the trust dial ----- */ + .proof { + display: grid; + grid-template-columns: 1fr 1fr; + gap: clamp(1.4rem, 3vw, 2.4rem); + } + @media (max-width: 880px) { .proof { grid-template-columns: 1fr; } } + .proof-card { + background: var(--parchment-light); + border: 1px solid var(--rule); + border-radius: 6px; + padding: 1.6rem 1.5rem; + display: grid; + grid-template-rows: auto auto auto 1fr auto; + gap: 0.6rem; + } + .proof-card.sealed { border-top: 3px solid var(--thread); } + .proof-card.public { border-top: 3px solid var(--seal); } + .proof-card .posture { + font-family: var(--mono); font-size: 0.6rem; letter-spacing: 0.16em; + text-transform: uppercase; + } + .proof-card.sealed .posture { color: var(--thread); } + .proof-card.public .posture { color: var(--seal); } + .proof-card .domain { + font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.12em; + color: var(--ink-faint); + } + .proof-card h3 { + margin: 0; + font-family: var(--display); + font-variation-settings: "opsz" 36, "SOFT" 60, "wght" 460; + font-weight: 500; font-size: 1.2rem; color: var(--ink); + } + .proof-card h3 em { font-style: italic; color: var(--seal); font-variation-settings: "opsz" 36, "SOFT" 100, "wght" 380; } + .proof-card.sealed h3 em { color: var(--thread); } + .proof-card p { margin: 0; font-size: 0.95rem; color: var(--ink-soft); line-height: 1.55; } + .proof-card .visit { + font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.14em; + text-transform: uppercase; color: var(--ink); text-decoration: none; + border-bottom: 1px solid var(--rule); padding-bottom: 0.18rem; + width: fit-content; align-self: end; + } + .proof-card .visit:hover { color: var(--seal); border-bottom-color: var(--seal); } + .proof-caption { + text-align: center; margin: 1.6rem 0 0; + font-family: var(--mono); font-size: 0.72rem; letter-spacing: 0.08em; + color: var(--ink-faint); + } + + /* ----- "what it ends" problem → solution table ----- */ + .ends-table { + width: 100%; + border-collapse: collapse; + border-top: 1px solid var(--rule); + } + .ends-table td { + padding: 1.05rem 0.7rem; + border-bottom: 1px solid var(--rule-soft); + vertical-align: top; + font-size: 0.98rem; + line-height: 1.5; + } + .ends-table td.problem { + width: 42%; + font-family: var(--display); font-style: italic; + font-variation-settings: "opsz" 36, "SOFT" 80, "wght" 360; + color: var(--ink-faint); + } + .ends-table td.gives { color: var(--ink-soft); } + .ends-table td.gives strong { color: var(--ink); font-weight: 600; } + @media (max-width: 620px) { + .ends-table td { display: block; } + .ends-table td.problem { width: auto; padding-bottom: 0.3rem; border-bottom: none; } + .ends-table td.gives { padding-top: 0.3rem; } + } @@ -882,8 +1031,8 @@
spiritwriter / library no. vi
- content-addressed memory for agentic systems - verified · sha-256 + local-first memory for agents — you own it + no service · no custody apache 2.0
@@ -892,11 +1041,11 @@ @@ -915,31 +1064,31 @@

- A fabric for - what your agents - remember. + Agent memory + you own.

- Content-addressed agent memory for AI systems. Shards that grow without losing history. Hash-chained traces that prove what ran. Encryption you can hand off without handing over keys. A library, not a service. + Durable memory, provable traces, scoped delegation, and entity resolution — a local-first library you drop under whatever agent stack you already run. Your data never leaves your machine. No service, no custody, no rent.

- - Open the source - - - + + Open the source + +
+

See it running → frio.help · news.spiritwriter.ai

@@ -947,24 +1096,24 @@

-
+
I.
-

The premise, plainly stated.

-
folio i — manifesto
+

You've built this before.

+
folio i — the ache
-

An agent that cannot remember what it learned, or prove what it did, is not infrastructure. It is a sketch.

-
— filed under /fabric
+

There's no standard library for the layer beneath the agent. So you keep rebuilding it.

+
— filed under /substrate
-

Most memory systems for AI either embed everything into a vector and lose the lineage, or they bolt on a database and surrender locality, ownership, and proof. Spiritwriter takes the older, harder route. Knowledge is broken into atoms with explicit fields. Atoms compose into shards. Shards are addressed by the hash of their contents, so identical content from different agents resolves to the same record — no duplicates, no drift.

+

Every agentic app re-solves the same problems. Where does what the agent learned live — and how do you keep it from drifting into contradiction? How do you hand a sub-task to another agent without handing over the keys to everything? And when something breaks three steps back, can you prove what actually happened?

-

Above the shards: traces. Every step an agent takes is appended to a hash-chained log; tampering with one entry breaks the chain after it. Entitlements let you delegate work to a sub-agent without surrendering master keys. Encryption comes in two postures, picked by who you don't trust. And entity resolution works by defining fields, not surface forms — so "Bear" the dog never silently merges with "Bear" the brand.

+

So you rebuild the glue for each app, slightly different every time. Or you eat the misalignments, the delegation failures, the memory drift. Or you rent a managed service that takes custody of your data and your latency budget.

-

It is a library, not a service. One pip install, no daemon, no vector store to host, no GPU. The artifact is the registry — version-controlled, emailed, restored from a backup like any other file.

+

Few teams do provable tracing or scoped entitlements without standing up heavy infrastructure. The layer beneath the agent has been left to improvisation — re-glued in every codebase, owned by none of them.

@@ -972,118 +1121,99 @@

The premise, plainly stated.

-
+
II.
-

Primitives, in order of use.

-
folio ii — index
+

One substrate. Trust is a dial.

+
folio ii — the idea
-
-
-
i
-
-

Memory Shards

-

Knowledge that grows without losing history. New observations supersede old via lineage links; identical content from different agents dedupes into a single record. Decay classes prune what shouldn't outlive its purpose.

-
sha-256 over atoms + scope + origin
-
-
- -
-
ii
-
-

The Shard Store

-

Local-first storage on disk; transparently fetches missing shards from a network when one is configured. Named refs handle the "latest version of X" pattern without breaking content addressing.

-
git-style object layout · optional ipfs L2
-
-
- -
-
iii
-
-

Encryption, two postures

-

AES-256-GCM when the operator and key-holder cooperate. NaCl sealed boxes when the operator must not see content — multi-tenant hosting, source protection, zero-knowledge monitoring. Pick by who you don't trust.

-
aes-gcm · nacl · ed25519
-
-
+
+
+

The layer your stack is missing.

+

spiritwriter is content-addressed memory, hash-chained traces, scoped entitlements, and deterministic entity resolution — composable primitives you dial from fully public and provable to fully private and zero-knowledge by changing one setting.

+

Bring your own everything-else. spiritwriter handles what those layers leave out.

+
    +
  • memorycontent-addressed shards with lineage + decay.
  • +
  • provenancehash-chained, signable traces.
  • +
  • delegationscoped entitlements, enforced before decrypt.
  • +
  • resolutiondeterministic entity IDs, no embeddings.
  • +
+
-
-
iv
-
-

Entitlements

-

Delegate scoped access to a sub-agent without handing over master keys. Tokens bundle decryption keys, scope patterns, capabilities, and budget; the store enforces every constraint before decrypting.

-
bearer · scoped · budgeted
-
-
+
+
+
+
your orchestrator LangGraph · CrewAI · a raw loop
+ bring your own ↑ +
+
+
your retriever vector DB · RAG · full-text
+ bring your own ↑ +
+
+ spiritwriter + memory · provenance · delegation · resolution +
+
+

It's not an agent framework, and it's not a vector database. It's what those sit on.

+
+
+
-
-
v
-
-

Delegated Jobs

-

Package encrypted content + task + entitlement into one unit of sub-agent work. The orchestrator hands the package over; the sub-agent hydrates, executes, returns a result shard. Every step traced.

-
jobspec · package · hydrate · settle
-
-
+
-
-
vi
-
-

Entity resolution

-

Tell entities apart when names collide ("Bear" the dog vs. "Bear" the brand) and merge them when surface forms diverge ("Carlos Martinez" vs. "MARTINEZ, CARLOS A"). Same engine, both directions. No graph database to operate, no embedding service to call — define your identifying fields, hand in records, get canonical IDs back.

-
sqlite-backed · domain-agnostic · zero-infrastructure
-
-
+ +
+
+
III.
+

Built once. Proven twice, at the extremes.

+
folio iii — the proof
+
-
-
vii
-
-

Tracing

-

Replay exactly what an agent did, prove nothing's been edited, render the run as workflow / genealogy / multi-agent diagrams. Hash-chained JSONL with optional Ed25519 signing.

-
jsonl · chained · signable
-
-
+

We didn't write a spec and hope. Two live products run on the same library at opposite ends of the trust dial.

-
-
viii
-
-

Audit

-

Tamper-evident security audits for Android APKs. Inputs, evidence, findings, and final report bound into a hash-chained trace plus a self-hashing witness — anyone with the APK can re-run verification offline.

-
traced · witnessed · re-runnable
-
+
+
+
● maximum privacy
+
frio.help
+

frio — you own it, all the way down

+

A zero-knowledge service that helps families find an incarcerated relative. The operator never sees the searches; matching happens in memory; alerts go out. No one running it can see who looked for whom — local-first taken to its end: the operator can't monetize what they can't see.

+ visit ↗
- -
-
ix
-
-

Shingled extraction

-

Turn long-form text into atoms without losing facts at chunk boundaries. Overlapping windows + multi-pass extraction; only atoms that appear across multiple passes survive. The result feeds the shard store and the entity-resolution engine: extract once, resolve continuously.

-
overlapping windows · n-of-k voting · checkpoint-resumable
-
+
+
● maximum transparency
+
news.spiritwriter.ai
+

news — every fact, signed and traced

+

A news engine that atomizes articles, rewrites them across the spectrum, and links every variant back to its source. The lineage is public and each shard is signed — you can follow a single fact as it mutates from outlet to outlet.

+ visit ↗
-
-
+

Same library. The only difference is the shard posture.

+
-
+
-
III.
-

The shape of the API.

-
folio iii — quickstart
+
IV.
+

Slip it under what you already run.

+
folio iv — adoption
-

Same content, same id. Always.

-

A shard is an immutable record of atoms — facts, conventions, observations — bound to a scope and an origin. Its identity is the SHA-256 of what it contains, so writing the same shard twice is a no-op. Hydration returns XML-tagged context, ready to drop into a prompt.

+

Additive, not a migration.

+

Store what your agent learns, hydrate it back into a prompt later. Get provenance on day one; lean on delegation and zero-knowledge when you're ready.

    -
  • putidempotent. duplicates dedupe.
  • -
  • hydratereturns prompt-ready XML.
  • -
  • decaypermanent · stable · active · session.
  • -
  • scopequeryable namespace.
  • +
  • local-firstshards are JSON on disk; the index is one JSON file. No daemon, nothing leaves your machine.
  • +
  • agent-readableevery capability ships a skill file — your agent learns the primitives by reading it.
  • +
  • cheap to leavefiles you own, Apache 2.0. Low exit cost, low risk to try.
  • +
  • no hostnothing to host means nothing to bill — no vendor in the middle of your data.
@@ -1126,22 +1256,22 @@

Same content, same id. Always.

-
+
-
IV.
-

The Bear problem.

-
folio iv — resolution
+
V.
+

We measured it. We tried to break it.

+
folio v — the numbers
-

You're extracting facts about Aaron from a stack of documents. Document 1 surfaces "Bear is Aaron's favorite." Document 2: "Aaron and Bear were at the park." Document 3: "Aaron's dog Bear, a 10-year-old black lab / border collie mix."

+

Entity resolution is where memory systems quietly corrupt themselves — merging two different people, or splitting one across three records. So we held it to a falsification battery, not vibes.

-

Each document gives partial defining-field coverage. Your extractor classifies Bear three different ways. Three identifiers for the same entity, and they don't align. A naive system keeps them separate; a sloppy one collapses by surface name and now Bear-the-dog merges with Bear-the-beer-brand from Document 4. Embedding-based systems hallucinate the boundaries — "Bear" the dog scores close to "Bear" the bear scores close to "Bear" the brand, and the merge decisions become unauditable.

+

100% auto-merge precision — zero incorrect merges across five benchmark corpora. And it surfaces 100% of same-entity matches: auto-merging the safe ones, flagging the rest for review, so nothing slips through silently.

-

The resolver hashes the defining fields — name, entity type, owner, dob — into an Entity Sense Signature: a deterministic identity hash. As more documents land, the field set per entity grows. The growing field set produces a stable ESS the moment you have enough fields to disambiguate. Fields not yet known don't penalize — they're absent from the hash.

+

No embeddings, no LLM in the merge path — deterministic hashing, normalization, and tiered escalation that fails loud instead of silently combining two different people. Backed by a falsification battery, a workshop curriculum, and runnable examples.

-

The same primitive handles the inverse. "Carlos Martinez", "MARTINEZ, CARLOS A", and "C. Martinez" across three rosters dedupe into one entity, because their defining fields normalize to the same hash regardless of surface spelling.

+

See the measurements →

@@ -1169,55 +1299,58 @@

Resolution tiers

-
+
-
V.
-

In production, quietly.

-
folio v — citations
+
VI.
+

What it ends.

+
folio vi — what you get
-
-
-
frio.help
-

frio — zero-knowledge jail roster monitoring

-

Encrypted search shards and fuzzy name matching for monitoring without disclosing the watchlist.

- visit ↗ -
-
-
news.spiritwriter.ai
-

news — dual-perspective with bias detection

-

Two points of view per story, plus transparent bias detection, source selection, and reader analytics — every judgment auditable through the trace.

- visit ↗ -
-
-
podcasts.spiritwriter.ai
-

podcasts — multi-agent video → audio

-

AI-generated podcasts assembled from multi-agent video production traces.

- visit ↗ -
-
-
github / claude-studio-producer
-

Studio Producer — media production pipeline

-

Canonical worked example for traced workflows; checkpointed multi-stage producer agent.

- visit ↗ -
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Memory that drifts into contradictionContent-addressed shards with lineage, supersession, and decay.
"Can I let a sub-agent see this?"Scoped entitlements — keys + scope + capabilities + budget, enforced before decrypt.
"What did the agent actually do?"Hash-chained, signable traces you can verify offline.
Duplicate / colliding entitiesDeterministic-then-fuzzy resolution, no embeddings.
Privacy vs. transparencyThe same dial — AES, sealed boxes, or fully public.
Sharing across machinesPrivate IPFS swarm, no database.
-

Bring your own agents.

-

One pip install. No service to host, no vector DB to keep alive. Read the source — it is the documentation that compiles.

+

Own your agents' memory.

+

One pip install. No service to host, no vector DB to keep alive, no one in the middle of your data. The artifact is yours — commit it, back it up, hand it off.

+ Read the source - - - browse the documentation -
@@ -1257,7 +1390,7 @@
Companion
Specs
@@ -1275,9 +1408,8 @@
Specs