Verified build proof · Live on 0G Aristotle mainnet · 2026-07-04

See the whole thing
in a few minutes.

No time to run it? You don't have to — this page is the whole product in a few minutes: every screen as a real screenshot, the on-chain iNFT mint shown on the 0G explorer, and a runnable command behind every claim. A private journal whose memory understands you, without that understanding costing you your privacy or ownership.

Your words. Your key. Nobody else can read it.

21
engine eval suites, all green, CI-enforced
4
live privacy layers — embed-local · anonymise · encrypt · TEE-sealed inference (now on)
iNFT
your memory, minted to your own wallet on 0G — and never for sale
100
Lighthouse a11y · best-practices · SEO
NOW LIVE · 0G ARISTOTLE MAINNET (CHAIN 16661)

Not testnet. Live, on-chain, provable.

Knole runs on 0G mainnet at knole.me. Every privacy and ownership claim below is a real mainnet transaction you can open on 0G ChainScan right now — not a promise, a receipt. Each row: what it proves, and the transaction that proves it.

Feature What the chain proves Outcome · on-chain
Memory iNFT (ERC-7857) KnoleMemory contract deployed to mainnet; your memory mints to your own wallet, un-sellable Token #1 minted → mint tx ↗
contract 0xf5F6…267A ↗
Reflection receipts (#8) Every reflection Merkle-batched into a tamper-evident root anchored on-chain — verifiable at /verify Root anchored → anchor tx ↗
Gas-batched anchoring Many users' memory roots committed in ONE transaction (each still individually Merkle-provable) — so scale doesn't drain gas 3 users → 1 tx → batch tx ↗
⭐ Auditable AI The sensing model's training data is published on 0G Storage (public, SHA-256-checkable) and a provenance commitment binding dataset + model + config is anchored on-chain Provenance anchored → commitment tx ↗
model delivered → ack tx ↗
Sealed inference + models Reflection (GLM-5.1), voice (Whisper) and image (Z-Image) run on the 0G mainnet Private Computer, TEE-sealed; private web research (Qwen-Max, verified tier) runs with the query anonymised — your name stripped before it ever leaves Live on the 0G mainnet router · balance-funded

The Auditable AI dataset is downloadable by its 0G Storage root 0x2bda0a7c…4608cd0 (SHA-256 0x914022c3…); the fine-tuned sensing model (Qwen2.5-0.5B LoRA) is trained + committed on mainnet but is not yet wired into the app — sensing still runs on the big sealed model, and the on-device model is provenance-shipped, not functional. Stated plainly, not dressed up.

THE FULL FLOW · ~90 SECONDS

Watch it work, end to end

Every frame below is a real screenshot from the live deploy — the seeded showcase and the guest onboarding path, captured this session. Read it top to bottom and you've seen the whole product.

STEP 01 · THE FIRST REFLECTION
Write one honest line. A reflection arrives.
A guest types a single sentence; Knole reflects it back — anonymised before the model, grounded in your own words. No signup to feel it.
Screen recording: a guest types one sentence and a reflection arrives, written from their own words
Live recording   guest onboarding on knole.me — write → reflection, unedited.
STEP 02
Land — no signup, no wall.
You can read, write, and feel the memory before you ever make an account.
Knole landing page
STEP 03 · TODAY
A calm place to write.
Pick a prompt or just start. When you hit Reflect, Knole weaves your real past into what it writes back — then sends you off to go live the answer, not to keep talking to a bot.
Today — the journal with a streamed reflection
STEP 04 · THE INDEX
Everything it remembers, in your own words.
Each memory shows its source quote, a recall count, and a ⬡ 0G badge. Editable, forgettable, append-only — a contradiction retires the old memory, never deletes it.
The Index — memories with source quotes and 0G badges
STEP 05 · ASK MY LIFE
Ask your own past — get receipts.
It answers from your real entries, quoting you back by date, never paraphrasing without a source — anonymised before the AI ever saw it.
Ask My Life — a grounded answer with cited receipts
STEP 06 · THE MIRROR
A day-15 synthesis of your own words.
For your first two weeks the Mirror shows only a quiet streak — missed days don't count against you. On day 15 it reveals a synthesis of your own words: each pattern cites a real entry, and it offers no advice. Anticipation, then reflection.
The Mirror — patterns citing real entries
STEP 07 · REMEMBERED
Your past returns, gently.
A past entry resurfaces with a "now" reflection and a chance to answer your past self.
Remembered — a resurfaced past entry
STEP 08 · CHAT
A thinking partner, not a chatbot.
It opens with one quiet question and takes a single thing at a time — and every turn is anonymised before the model. Encrypted; only you can read it.
Chat — the opening greeting; encrypted, only you can read it
STEP 09 · OWN IT
Recover any entry, live from chain.
Postgres is just a cache. In Settings, "Verify recoverable" rebuilds a real entry from its 0G root — ✓ RECOVERED LIVE FROM 0G — with the on-chain links right there.
Settings — RECOVERED LIVE FROM 0G with on-chain links
NEW SINCE SUBMISSION

What shipped after the write-up

Three things the submission called pre-mainnet — sealed inference off, no logged-in end-to-end run, no ownership layer — are now done, alongside a deeper product. Every frame below is a real screenshot, captured this pass. The receipts follow.

The Index — a minted memory iNFT card: not for sale, Token #3, view on 0G explorer
Own it as a token. Your evolving memory mints as an ERC-7857 iNFT to your own wallet — encrypted on 0G, and not for sale (the contract reverts every transfer). Here: Token #3, linked to the 0G explorer.
Settings — Seal your 0G copy to your wallet, sealed to 0x0e7d…1bab
Seal your 0G copy to your wallet. The durable copy is re-encrypted under a key only your wallet can derive — sealed to 0x0e7d…1bab, a key Knole never holds.
Settings — signed in via a real disposable inbox, with Mindfile export and Sign out
A real, logged-in session. Signed in through a real disposable inbox via Privy email-OTP — the authenticated end-to-end run, done headlessly. Mindfile export and Sign out, all live.
Chat — a crisis-safety response with 988, 741741, and 911 resources
When the words turn heavy. An entry about self-harm pauses the reflection and surfaces real help — 988, text HOME to 741741, 911 — never a chatbot pretending to be a therapist (SB243).
The Mirror before day 15 — arc-gating, emotional weather, and the AI-disclosure line
It tells you it's an AI. The Mirror holds back until day 15 — missed days don't count — and every surface discloses that Knole is a reflection, not a person.
Future-Self — a grounded letter from who your entries point toward
Future-Self. A letter from the person your own entries are pointing toward — grounded in real commitments, not generic advice.
A private Wrapped — a shareable card of the shape of your year, never the words
A private Wrapped. A shareable card of the shape of your year — never the words.
Your year in one page
Your year in one page. The arc of what you wrote, at a glance.
On this day — what you were carrying a year ago
On this day. What you were carrying a year ago, back to answer your past self.
Four reflection lenses — Gentle Mirror, Pattern Finder, Blunt Friend, Decision Coach
Four lenses. Read the same entry as a Gentle Mirror, Pattern Finder, Blunt Friend, or Decision Coach — an anti-sycophancy engine that won't just flatter you.
Night — a full dark theme across every surface
Night. A full dark theme across every surface, with no flash on load.
EVERY FEATURE, IN USE

The rest of the product

The surfaces the flow above doesn't linger on — captured in use, so the whole app is visible end to end, not just described.

The day-15 reveal — recurring themes charted, the Dreaming card, and Sealed in 0G TEE
The reveal, in full. Recurring themes charted, the overnight Dreaming that surfaces one new pattern, and every word Sealed in 0G TEE.
Onboarding — What was on your mind today? with the age gate and an import path
No signup — a first hello. One honest line, the SB243 age gate, and an import path in — a reflection in under 90 seconds.
Today — the 30-second check-in, a prompt, and the Pattern Mirror progress
The 30-second daily on-ramp. A one-tap check-in and a gentle prompt — the retention loop that earns the day-15 reveal.
Today — a year-ago resurfacing and a consent-gated quiet noticing
It reaches back, gently. A year-ago resurfacing, and a consent-gated "quiet noticing" when you've gone quiet on something.
Bring your data — paste an old journal or a ChatGPT export
Bring your data. Paste an old journal or a ChatGPT export — it becomes memories, same engine, same encryption.
Save to Knole — the Chrome extension capturing a highlight, encrypted
Save to Knole from anywhere. Highlight a tweet, an article, a reel — one click, encrypted, only you.
Upgrade — Free vs Knole Deeper, never gates emotion
Never gates emotion. A signature-verified paywall — the daily practice stays free; only depth is paid.
The Index — editing and forgetting a memory, append-only
Editable, forgettable. Correct any memory — your edit always wins — or forget it. Append-only, never a black box.
EVERYTHING CHATGPT DOES — PRIVATE

The everyday surfaces, on 0G

Knole isn't only backward-looking. It researches the live web, answers anything, makes images, and runs guided arcs — every one private, every one on 0G. Real outcomes, captured this pass — not descriptions.

The Life Canvas — a mood arc, theme constellation, and cast of characters, all drawn from the user's own entries
The Life Canvas — the artifact only your own data can draw. One private page that is your life: your mood traced across the days you wrote, the themes you circle (sized and tinted by how they land), the people who keep appearing, and the shape of your months. Not a chart you asked an AI to render — the one made of you, that never leaves your device.
Private Research — a web-researched answer citing a 2018 Journal of Affective Disorders meta-analysis
Private Research — real web search, anonymized. A forced live web search on 0G's Qwen-Max; your name is stripped before the query leaves. Here: journaling for anxiety, answered with a 2018 Journal of Affective Disorders meta-analysis of 24 trials — cited, not hallucinated.
Ask Knole — a private assistant drafting a kind-but-firm deadline-extension email
Ask Knole — a private ChatGPT that can't read your journal. Anything on your mind, anonymised before the model and saved to nothing. Here: a kind-but-firm deadline-extension email, drafted in full.
Ask My Life — a throughline plus dated receipts quoting the user's own entries
Ask My Life — your past, with receipts. Ask anything; Knole answers from your own history and quotes you back by date — never a paraphrase without showing where it came from. Here: "what have I been avoiding?" → a throughline and the dated entries that prove it.
Chat — a private thinking partner that remembers, with a 'drew on 6 things you've shared' receipt
Chat — a thinking partner that remembers. Talk freely, nothing saved until you turn it into an entry. It draws on what you've shared (a "drew on 6 things" receipt), anonymised before the model and de-anonymised in the reply.
Create — an ink-wash river at dawn generated on 0G Z-Image
Create — images on 0G, yours to keep. A few words become a picture on 0G's Z-Image, downloadable and private. Everything ChatGPT does, without the surveillance.
Programs — guided reflection arcs
Programs — guided arcs when the page feels blank. Working With Anxiety, The Decision Journal, Morning Pages, 14 Days of Gratitude — a few minutes a day, always yours to leave.
Intentions — what you're working toward, in your own words
Intentions — what you said you'd do. Knole reads your entries and surfaces the commitments you made to yourself, quoted back in your own words.
Portable identity — grant another 0G app scoped, revocable access to your memory
Portable memory identity. Your memory is yours to carry — grant another 0G app or agent scoped, revocable access. Ownership you can exercise, not just assert.
Therapy prep — talking points synthesized from recent entries, each with a verbatim dated quote
Therapy prep — walk in with your clearest self. Talking points gathered from what's been alive since last time, each backed by a verbatim, dated quote from your own entries. Nothing leaves the page unless you copy it.
Future-Self — a grounded letter from who your entries point toward
Talk to your future self. A grounded letter from who your own entries point toward — a mirror of your values, never a prophecy. Here: the job decision, answered back in your own patterns.
A private Wrapped — a shareable card of the shape of your fortnight, never the words
A private Wrapped. A shareable card of the shape of your fortnight — the journey grid, the day count, a theme — never the words. Only the shape ever leaves your device.
Pattern Mirror — a composed letter with a proof-of-journaling streak committed on 0G Chain
The Pattern Mirror, composed. "Here's what was on your mind" — a private letter written from your own words, with a proof-of-journaling streak committed on 0G Chain and your emotional weather traced over time. The throughline names a pattern you couldn't see yourself.
Auditable AI — the sensing-model provenance card, committed on 0G mainnet
Auditable AI — stated honestly. A small sensing model fine-tuned on 0G, its dataset (SHA-256-checkable) and provenance committed on-chain. Live entries are read by the larger model sealed in the 0G TEE; this open fine-tune is the fully verifiable version of that job — not a black box, and not overclaimed.
THE PROOF · IT'S ALL REAL

Now the receipts

The flow above isn't a mockup. Each claim below is backed by a command you can re-run, an on-chain root, or an eval the CI enforces — re-verified this session. Skim the headers; dig where you doubt.

What's proven

Privacy: embed locally, anonymise before the model, encrypt under your key on 0G — and now a fourth live layer: TEE-sealed inference on 0G Private Computer (glm-5.1), so even the operator can't read what the model writes back.

Ownership: Postgres is only a cache; every entry rebuilds byte-identically from 0G — and your memory mints as an iNFT to your own wallet, un-sellable by construction.

Memory: a real engine — embed, extract, reconcile (bi-temporal supersede), retrieve (RRF hybrid).

Honesty: a CI gate polices our own headline numbers; pre-mainnet limits are stated plainly.

PROOF 01

Anonymised before the model

The single most load-bearing claim: the LLM never sees who you are. A local NER model masks every person, place, and organisation to stable tokens before any text leaves the box; a server-side reverse map restores your words in the reply. One gateway — no call site can forget to scrub.

npm run test:anon
WHAT YOU WROTE (encrypts under your key, stored on 0G):
  "Told Mara the real fear about moving to Berlin — that leaving the job at
   Google means I was never serious about the writing. Even Dr. Okafor noticed."

WHAT THE MODEL ACTUALLY RECEIVES (anonymised):
  "Told [PERSON_1] the real fear about moving to [PLACE_1] — that leaving the job at
   [ORG_1] means I was never serious about the writing. Even Dr. [PERSON_2]or noticed."

RESTORED IN THE REPLY (reverse map, server-side only):
  [PERSON_1]→Mara   [PLACE_1]→Berlin   [ORG_1]→Google   [PERSON_2]→Okaf
No full identifiable name reaches the model — gated statistically by the privacy-leak eval

The honest worst case is shown deliberately: [PERSON_2]or — the NER tagged only the prefix of "Okafor", leaving a meaningless or fragment. The identifiable name is still gone. NER is probabilistic, so the guarantee is "no full identifiable name reaches the model" (piiScrubRate ≥ 0.85), not "every byte of every name."

PROOF 02

Encrypted under your key on 0G

Your entry is AES-256-GCM ciphertext before it touches the chain, sealed under a key derived for you alone (HKDF-SHA256, your user id as the domain separator). Fetch the 0G blob with no key and there is nothing to read.

npm run test:privacy
Fetched the raw 0G blob for the latest on-chain entry, no key applied.
  ciphertext-only ........ a 24-char plaintext probe is ABSENT from the bytes ✓
  wrong key .............. fails the GCM auth tag (tampered/incorrect) ✓
  your key ............... recovers the JSON envelope, obj.text === plaintext ✓
The 0G blob holds ciphertext only; nothing but your key recovers it
PROOF 03

Recoverable from chain

You saw "✓ RECOVERED LIVE FROM 0G" in the flow (step 09). Here's the same thing as a test: corrupt the Postgres copy, and Knole rebuilds the entry purely from its 0G root — byte-identical.

npm run test:restore
Wiped the Postgres copy, called restoreEntryFromChain(uid, root):
  root  0x133bf6960bc64ae60eb061ce10e5b97f3c1b55eb827e6169ac1c46577b6edc23
  restoredText === original .......................................... ✓
0G rebuilt the wiped entry identically — the chain is the backstop
PROOF 04

Nobody else can read it

A journal is worthless if another user — or a forged request — can reach your inner life. Three personas with deliberately overlapping feelings run full journeys; every user is then probed with every other user's life.

npm run test:multiuser
  recalled own memory : true  ("You have concerns about your left knee…")
  recalled own memory : true  ("You're a new parent to a baby named Theo…")
  recalled own memory : true  ("You've started taking weekly piano lessons…")
  isolation — retrieval leaks: 0, ask leaks: 0
Every user's memory composes; no retrieval or ask ever crosses the user boundary

The engine-level data-isolation eval additionally proves IDOR: user A calling setMemoryStatus / updateMemoryContent on user B's memory id is a no-op.

PROOF 05

A memory that understands you

The Index you saw (step 04) is backed by a 21-suite engine gate — every suite green required for the release to pass, enforced in CI.

npm run evals
21-suite engine gate, every suite green required for exit 0:
  retrieval (hit@1 / hit@3 ≥ 0.8) · extraction-coverage · dedup · groundedness
  reconcile (bi-temporal supersede) · pinned-survival · user-correction-wins
  provenance · forgetting · confidence-calibration · privacy-leak · crypto · …
21/21 suites green — written to the eval_runs table, CI-enforced
PROOF 06

Take it with you

Ownership means leaving. The Mindfile export is a full, round-trippable JSON of every entry and memory — and forgotten, superseded, or rejected memories are provably excluded.

npm run test:export
Exported the demo Mindfile and re-validated it:
  entries ......... 12
  memories ........ 35
  round-trip ...... valid
  forgotten / superseded / rejected leaked into the export ......... 0
A clean, complete, round-trippable export — your data leaves with you
PROOF 07 new

Sealed inference is on

The fourth privacy layer, now live. Reflection runs inside a 0G TEE — 0G Private Computer, model glm-5.1 — so even the operator can't read what the model writes back. A stalled enclave falls back to NVIDIA within 15s, and the name-scrub protects that fallback too, so the app never goes dark and the guarantee never weakens.

chatSealed("…a hard day", { maxTokens: 1200 }) · 0G Private Computer
POST router-api.0g.ai/v1/chat/completions   (stream: false)
  sealed .... true          ← served by the 0G TEE, not the NVIDIA fallback
  model ..... glm-5.1
  reply ..... "After such a heavy day, I hope you find a soft place to rest tonight."
The reflection came back from the 0G enclave — sealed = true, model = glm-5.1

sealedActive() gates the on-Mirror attestation badge, so the "composed where even we can't read it" claim only ever appears when the inference genuinely ran in the enclave — never on the fallback. And the fallback runs both ways: reflection, memory extraction, the reconcile judge, and streaming all fail over to the 0G TEE if NVIDIA is ever unreachable — so the whole product runs on 0G alone. An outage costs latency, never capability (the entire demo was rebuilt through 0G with NVIDIA disabled).

PROOF 08 new

You own it, as a token

Your memory isn't only yours to read — it's yours to hold. The Memory iNFT (ERC-7857) mints an encrypted snapshot of who you are to your own wallet; the token records only the 0G storage root and a hash. And it can never be taken from you or sold: every transfer path reverts in the contract.

KnoleMemory (ERC-7857) · 0G mainnet
  contract ............... 0xf5F6Ee304e8BfD94666a4AdeC171d116e55c267A
  mint(to = your wallet) . Token #3 · encryptedURI = 0g://<root> · metadataHash set
  approve() .............. revert — not for sale
  setApprovalForAll() .... revert — not for sale
Minted to the user's own wallet on 0G; transfer is impossible by construction

Mint and self-custody need no oracle (the ERC-7857 oracle only re-encrypts on a sale, which Knole deliberately never does). evolve() re-anchors a fresh snapshot as your memory grows, keeping the same token.

PROOF 09 new

Logged in, end to end, for real

The roadmap's open item — a full authenticated run — is done, and headlessly. A real disposable inbox receives a real Privy OTP; the embedded wallet really signs to derive the client-side key; two entries are written; then a real on-chain iNFT mint through the UI.

npm run test:e2e — wallet-connect.spec.ts (local, auth-on)
  INBOX ............ knoleqa…@web-library.net        (real disposable inbox, mail.tm)
  OTP .............. ●●●●●●  read from the real email  (Privy email-OTP)
  GUEST 0 · SIGNOUT 1 .......................... authenticated
  AGE_AFFIRMED ................................. SB243 gate cleared
  CLIENT_ENC_ENROLLED .......................... wallet signed → 0G copy sealed to the wallet key
  INFT_MINTED .................................. on-chain mint via the UI
Real inbox → Privy OTP → wallet signature → on-chain mint — headless, no shortcuts
DEPTH

Every surface

The whole product, each route mapped to what it proves — swept desktop (1280) + mobile (412, Pixel 7) for a non-error status, real content, and zero console errors.

Today /today

Write an entry; a reflection streams back, weaving in real past memories, then sends you to go live the answer.

journal.spec.ts · groundedness eval

Chat /chat

A thinking partner that remembers — every turn anonymised before the model, de-anonymised in the reply.

sealed.ts gateway · test:stream

Ask My Life /ask

RAG with receipts. Quotes you back by date; refuses an empty query without spending an LLM call.

ask.spec.ts · ask-negative.spec.ts

The Mirror /insights

A day-15 synthesis of your own words; each pattern cites a real entry, arc-gated, no advice.

mirror-groundedness eval · mirror.ts

Life Canvas /canvas

Your whole life on one private page — a mood arc, a theme constellation, your cast of characters, and the journey grid — every panel drawn from your own entries. The artifact only your own data can make.

lifeCanvas.ts · valence · themes · relationship memories

The Index /the-index

Every memory with its source quote, recall count, and ⬡ 0G badge — editable, forgettable, append-only.

provenance eval · memory_history

Remembered /remembered

Resurfacing — a past entry returns with a "now" reflection and a chance to answer your past self.

resurface.ts · /remembered QA pass

Settings /settings

Live decrypt-from-chain ownership proof and the real anchor + tx links; a downward-only consent dial and four voices; and real data-rights — forget a date range, or delete everything.

restore.ts · forgetRangeFn · deleteAccountFn

Save / Extension /extension

Capture from anywhere — the loadable MV3 Chrome build turns a thought into "just another memory."

extension/ · test:ext-rate

Bring your data /settings

Paste an old journal or an export and Knole imports it as memories — same engine, same encryption. Switching in is one paste; switching out is the Mindfile export.

importHistory · doImport

Onboarding /onboarding

No-signup aha: a guest reflects in under 90 seconds, then an honest "sign in to keep it" — never a wall.

first-aha eval · onboarding.spec.ts

The worker npm run worker

Overnight Dreaming consolidates memory; a consent-gated nudge references a real commitment — warm, never surveillant.

dreaming.ts · nudge + creepiness evals

Upgrade /upgrade

A Stripe paywall whose webhook verifies the signature before mutating any plan; a tampered signature is rejected.

billing.ts · test:billing

Guest gate all routes

A guest sees an honest sign-in line; the doomed write-stream fetch is never fired, so no 401 hits the console.

guest-gate.spec.ts (hitStream === false)

Own your memory /the-index

Mint your evolving memory as an ERC-7857 iNFT to your own wallet — encrypted on 0G, and un-sellable: the contract reverts every transfer.

inft.ts · KnoleMemory.sol · wallet-connect.spec.ts

Seal to your wallet /settings

Re-encrypt your 0G copy under a key only your wallet can derive — a password Knole never holds, so not even we can read that copy.

clientEnc.ts · clientCrypto.ts

Future-Self /future

A letter from the person your own entries point toward — grounded in real commitments, not generic advice.

futureself.ts · futureStream.ts

Wrapped · Year · On-This-Day /wrapped

A shareable card of the shape of your year (never the words), the whole arc on one page, and what you carried a year ago.

wrapped.tsx · year.tsx · onThisDay.ts

Reflection lenses /today

Read the same entry four ways — Gentle Mirror, Pattern Finder, Blunt Friend, Decision Coach — through an anti-sycophancy engine that won't just flatter you.

reflect.ts · deep.spec.ts

Crisis safety + disclosure all surfaces

An entry about self-harm pauses the reflection and surfaces real help (988 · 741741 · 911); every surface discloses Knole is an AI, not a person (SB243).

crisis.ts · safety.ts · gaps.spec.ts

Mood + Omission Radar /insights

A mood-trajectory graph traces your emotional weather over time; an omission radar names what you've quietly stopped mentioning — a real zero-occurrence test, not a guess.

valence.ts · omission.ts

Retention loop /today · worker

A one-tap daily check-in keeps the streak without a full entry; a digest email and a consent-gated web push reach back only when there's a real, earned thing to say.

digest.ts · notify.ts · proactivity.ts

Private Research /research

A forced live web search on 0G's Qwen-Max — your name is stripped before the query leaves, so the search never carries your identity. Real citations, not the model guessing from memory.

research.ts (forced_search) · anonymise PER-only

Ask Knole /assistant

A private general assistant — anything on your mind, anonymised before the model and saved to your journal never. A ChatGPT that knows the shape of you but can't read your data.

assistant.ts · streamed reply

Create /create

Text-to-image on 0G's Z-Image — a few words become a picture, generated privately and downloadable. Everything ChatGPT does, without the surveillance.

image gen on 0G · create.tsx

Programs /programs

Guided reflection arcs for when the page feels blank — Working With Anxiety, The Decision Journal, Morning Pages, 14 Days of Gratitude — a few minutes a day, always yours to leave.

programs.ts · startProgram

Intentions /intentions

The commitments you made to yourself, read back from your own entries and quoted by date — what you said you'd do, held gently in front of you.

intentions.tsx · engine recall

Therapy prep /therapy

A session brief from what's been alive since last time — grounded in your own words and dated, yours to take; and it gates honestly when there isn't enough recent writing yet.

therapy.tsx · recent-window guard

Portable identity /identity

Grant another 0G app or agent scoped, revocable access to your memory — ownership you can actually exercise, not just assert.

identity.tsx · revocable grants

Auditable AI /verify

A small sensing model fine-tuned on 0G, its dataset (SHA-256-checkable) and provenance committed on-chain; plus recompute any reflection receipt to its anchored root. Stated honestly: live entries are read by the larger TEE-sealed model, and this open fine-tune is the verifiable version of that job.

sensingProvenance.ts · verifyReceipt

Correlations /insights

Gentle correlations from your own entries — how your mood shifts with the activities you log, the topics you write, and the day of week. Phrased as hypotheses, never causes, and gated on enough data so a coincidence never masquerades as a pattern.

correlations.ts (≥12-entry gate) · test:correlations

Pay with 0G /create

Top up credits with no card — send 0G to the treasury from the wallet you already have; the transfer is verified on-chain and credited to you, idempotent per tx hash so a replay never double-counts.

payWith0G.ts · test:og-pay (a real on-chain 0G transfer)

Installable app any phone

A real installable app, not a website — one tap to your Home Screen on Android, an Add-to-Home-Screen guide on iOS, offline shell, app shortcuts, and web push. Voice-first capture on the phone: open, speak, done.

manifest.webmanifest · sw.js · PwaSetup.tsx

Share the shape /card

The one artifact only your own data can draw, made postable — your mood arc and the themes you circled, rendered to a beautiful card. No words, no names, only the shape; shares straight to Instagram or X. Private enough to post.

card.tsx (canvas render · Web Share API)
DEPTH

Under the hood

Reflections, chat, Ask, the Mirror, and the nudge all draw on one engine — and one invariant: plaintext is encrypted before it touches the chain, anonymised before it touches the model.

THE MEMORY ENGINE

Embed · extract · reconcile · retrieve

Embed locally
all-MiniLM-L6-v2, 384-dim, no API call. embed.ts
Extract facts
an LLM reads the ANONYMISED text only — people, goals, patterns, commitments, values. engine.ts → sealed.ts
Reconcile
content-hash UPSERT dedup, then a 3-way LLM judge: reinforce a reworded duplicate · supersede a contradiction (bi-temporal: kept with invalid_at) · keep the independent. engine.ts
Encrypt + anchor
AES-256-GCM under your key → upload to 0G Storage → root anchored on the entry row. og.ts
Retrieve
RRF hybrid: pgvector cosine ⊕ lexical full-text, fused — an exact keyword surfaces even when the vector arm wouldn't. engine.ts

Recall earns importance (retrieving a memory bumps its recall_count); a user edit flips confidence to 1.0 and wins any contradiction; a forgotten memory never surfaces again, yet memory_history still records that it existed.

THE GATE

Every eval suite

npm run evals writes one row per suite to eval_runs; the gate passes only when every suite is green. LLM-judged suites retry up to 3× so a stochastic miss doesn't fail the gate while a broken path fails all attempts.

01 · retrievalhit@1 ≥ 0.8 and hit@3 ≥ 0.8
02 · extraction-coveragedurable identity keywords covered ≥ 0.8
03 · dedupsame content twice → 1 row, recall_count = 1
04 · groundednessreflections invent no concrete fact (LLM judge)
05 · reflection-form≤ 1 question, never opens with "why"
06 · reconcilecontradiction supersedes; restatement reinforces, no dup
07 · recallretrieval bumps recall_count ≥ 1
08 · hybrid (RRF)exact keyword surfaces via the lexical arm
09 · forgettinga forgotten memory never surfaces again
10 · pinned-survivala pinned memory survives the same contradiction
11 · user-correction-winsa user-edited memory survives the contradiction
12 · provenanceevery memory traces to its source entry
13 · nudge-groundinga proactive nudge references a real commitment
14 · creepinessthe nudge tone is warm, never surveillant (LLM judge)
15 · data-isolation (+IDOR)no cross-user retrieval; A can't read/mutate B by id
16 · mirror-groundedness≥ 3 real themes + a real entry quote; arc-gating holds
17 · privacy-leakpiiScrubRate ≥ 0.85 (0 PII target to the model)
18 · first-aha< 90s to a > 40-char reflection + ≥ 1 memory
19 · cryptoGCM round-trip + tamper + wrong-key + IV-unique + cipher-only
20 · confidence-calibrationstated fact outranks tentative inference; a user edit → 1.0
21 · key-providerv1 byte-identical; rotation reads old + new; per-user keys distinct
THE STACK

What it's built on

FrontendTanStack Start (Router + Query) · React 19 · Vite · Tailwind v4 · shadcn/ui
Embeddingslocal all-MiniLM-L6-v2 via @xenova/transformers — no API
Anonymiselocal bert-base-NER — masks people, places, orgs to stable tokens
LLMNVIDIA NIM (llama-3.3-70b, dev) → 0G Sealed Inference (prod)
Storage / chain0G Aristotle mainnet — Storage + Private Compute — via ethers
DatabaseNeon Postgres + pgvector (HNSW) via Drizzle ORM
AuthPrivy (email-OTP → sealed session cookie)
CryptoAES-256-GCM + HKDF per-user keys, versioned rotation (keyProvider.ts)
TRUST

How it holds up

Pre-mainnet limits are stated plainly — the same discipline a CI check:numbers gate now enforces on our own headline numbers.

SECURITY POSTURE

Under attack

At restAES-256-GCM on 0G; wrong key / tampered blob fails the auth tag (crypto eval + test:privacy)
In flight to the modelanonymised before any LLM; reverse map server-side only (test:anon + test:stream)
Cross-userper-user keys + engine isolation; UI/API IDOR refused (data-isolation eval + test:multiuser)
AuthPrivy email-OTP → sealed session cookie; require-auth on by default
AbuseIP rate limit before token lookup (test:ext-rate: 401 then 429); same-origin CSRF
Key custodyHKDF per-user keys, versioned rotation, KMS-injectable seam
DependenciesAll 43 transitive advisories triaged to unreachable code paths and documented; no blind dependency bump that breaks the runtime
HONEST SCOPE

What it is, and what it isn't

Knole hides

  • Your entry text — AES-256-GCM ciphertext on 0G
  • The real names / places / people from the model
  • Your data, from us — sealed under your key

Knole does not hide

  • That an entry exists (the 0G anchor is public)
  • The on-chain root hash
  • That a mainnet wallet signs the anchors

Pre-mainnet, stated plainly: the TEE "even we can't read it" path is on (0G Private Computer, glm-5.1); a stalled enclave falls back to NVIDIA within 15s, and the anonymise scrub protects that fallback too. The logged-in run is proven headlessly with a real inbox + Privy OTP. The rate limiter is in-memory; mainnet waits on an external audit and KMS-backed key custody. Full detail in SECURITY.md and docs/PROOF.md.

REPRODUCE

Run every proof yourself

None of this is a screenshot you have to trust. Clone the repo, point it at your own Neon DB + 0G mainnet wallet + NVIDIA key, and re-run each line — the engine and crypto proofs need that environment, so a bare fork skips them honestly rather than faking green. The browser sweep below runs read-only against the live deploy; the write, onboarding, guest-gate, and 404 flows run against a local build, since the live demo is read-only by design.

Engine gate (21 suites)npm run evals
Anonymise before the modelnpm run test:anon
Ciphertext-only on 0Gnpm run test:privacy
Byte-identical restorenpm run test:restore
Cross-user isolationnpm run test:multiuser
Memory recall composesnpm run test:remembers
Streaming privacynpm run test:stream
Mindfile exportDB_HTTP=1 npm run test:export
Browser sweep — live, read-only (26 runs)E2E_BASE_URL=https://knole.me npm run test:e2e
Write / onboarding / 404 — local gated buildE2E_BASE_URL=http://localhost:3000 npm run test:e2e
ON-CHAIN · 0G MAINNET

The roots

Real, on the 0G mainnet — here it is on the 0G explorer, and every hash below is a link you can click to verify. Knole hides your entry text (ciphertext) but never hides that an entry exists; the root is public and reveals nothing.

0G ChainScan — Mint 1 of Knole Memory, Success, ERC-721, TokenID 4
A real iNFT mint on 0G mainnet. "Mint 1 of Knole Memory (KNOLE)" · ✓ Success · ERC-721 · TokenID 4 — minted from the zero address to the user's own wallet.
0G ChainScan — the deployed KnoleMemory contract with a live mint history
The deployed contract. KnoleMemory, tracked as "Knole Memory (KNOLE)," with a live history of real mints on the 0G mainnet.
Memory iNFT contract0xf5F6Ee304e8BfD94666a4AdeC171d116e55c267A — KnoleMemory (ERC-7857), deployed on 0G mainnet; mints to the user's own wallet and reverts every transfer (not for sale)
A real mint (Token #4)0x870749f2…89ee115 — click to verify the on-chain iNFT mint transaction
Entry storage root0x133bf6960bc64ae60eb061ce10e5b97f3c1b55eb827e6169ac1c46577b6edc23 — the 0G Storage root test:restore rebuilt the entry from, byte-identical
Memory-root anchor0xc953476d8b48c17d843a2e0cc3eade03f4f010474501052ca2deecc008fd06b3 — the daily on-chain anchor of your memory root
Try it liveopen /settings → "Verify recoverable" rebuilds a real entry from 0G in front of you