I’ve been building a pair of tools that use Solid Pods as the storage backbone for personal AI memory, and I’d love to share them and get your feedback.
The problem I wanted to solve
Every day I have dozens of conversations across ChatGPT, Claude, and Gemini, plus I highlight articles, watch videos, and visit pages I’ll never find again. All of that context is siloed — locked inside commercial platforms I don’t control, with no way to search across it or ask follow-up questions later. I wanted a system where I own the archive, and no company could take it away or monetise it.
Solid was the obvious answer.
What Synara is
Synara is two things that work together:
1. Synara Extension — a Chrome browser extension (Manifest V3) that acts as a passive memory collector. It watches your AI sessions and browsing and writes structured JSON events to your Solid Pod. It currently captures:
-
Full conversations from ChatGPT, Claude, and Gemini (via DOM adapters with a MutationObserver for auto-capture)
-
Text highlights — anything you select and choose to save
-
YouTube/media — title, creator, platform
-
Page visits and manual “Remember This Page” bookmarks
All capture goes through a privacy filter before hitting the network — it redacts credit card numbers, API keys, tokens, SSNs, and password-field patterns. Sensitive URLs (banking, medical) are blocked from capture entirely.
Events are written to the pod at:
/apps/synara/events/{eventType}/{YYYY}/{MM}/{DD}/{ulid}.json
Each file is keyed by a ULID so they sort chronologically and can be cached indefinitely (immutable once written). The extension uses @inrupt/solid-client and @inrupt/solid-client-authn-browser with a token credentials flow stored in chrome.storage.local, so auth persists across browser restarts without re-login prompts.
There’s also a durable event queue — writes go to chrome.storage.local first, then drain to the pod, with automatic retry for failed writes.
2. Synara AI — a React App(the recall half). Once the extension has been collecting, you open the app(ai.privatedatapod.com) to explore and query everything:
-
Timeline — chronological feed of all captured events
-
Library — filterable, searchable browsable view
-
Ask Synara — natural language queries answered by OpenAI, grounded in your own memories. It ranks your stored events by relevance, shows you a prompt preview before anything is sent (so you can see and remove specific memories), then returns an answer with clickable source citations.
The web app is read-only against the pod — it never writes. It does an IndexedDB-backed delta sync: on first load it traverses the pod container tree and fetches all event files; on subsequent loads it only fetches files it hasn’t seen before (with a 48-hour exception for recent daily files still being actively written by the extension).
The OpenAI API key lives exclusively in an AWS Lambda proxy — it never reaches the browser.
The Solid-first design choices
A few things I tried to get right from a Solid perspective:
-
No Synara servers store any user data. The pod is the only datastore. The web app is a static site (CloudFront + S3); the only server-side component is the Lambda proxy that forwards anonymised text to OpenAI.
-
The pod path convention is designed to be legible and independently usable — another app could read or write the same event files if it followed the schema.
-
Auth in the extension uses token credentials rather than the browser OIDC session, because service workers don’t have access to browser cookies/sessions. Happy to discuss whether there are better approaches here — this felt like the right tradeoff.
-
The ULID + immutable file per event pattern keeps delta sync cheap and avoids any need for SPARQL or server-side indexes.
What I’d love feedback on
-
Is the pod path structure (/apps/synara/events/{type}/{YYYY}/{MM}/{DD}/{ulid}.json) the right shape? I considered putting everything in one container and using metadata for filtering, but the nested date hierarchy made delta sync much simpler.
-
Are there Solid conventions I should be following for app data paths or event schemas that I’ve missed?
-
The extension uses token credentials for pod auth from the service worker — has anyone solved this more elegantly?
-
Any interest in standardising an event schema for browser-captured data so other Solid apps could interoperate?
The extension is in active use and I’m adding adapters for more platforms. Happy to share more detail on any part of the architecture.
Thanks for building such a compelling platform — Solid made this whole thing possible.