Releases: tpierrain/second-brain-generator
v3.2.2 — The One Where Citations Click Through
Patch release polishing the local-mirror experience. All changes are engine-side and deterministic, so they reach every brain through /update-engine — not just new installs.
Clickable dual-link citations (the anchor)
Mirror-backed answers used to cite their sources as plain, non-clickable text. Now every search_vault citation carries:
- 🧠 a local copy link (
obsidian://open?path=<absolute>) on every result; - 🔗 a Notion source link on mirror notes (forwarding the canonicalized
www.notion.soURL).
Wiring: a nullable source_url column with an out-of-band ALTER migration — existing rows grandfather to null, no forced reindex. Link destinations are CommonMark <…>-wrapped and escaped (>/</whitespace percent-encoded) so any source_url stays a single clickable link.
/update-engine recap shows your vault note count
The update recap now states "your vault holds N note(s)" (+ "searchable as the reindex finishes" when a reindex ran). It's a deterministic on-disk Markdown count (no native deps), using the same exclusions as the indexer.
Onboarding polish (local-mirror skill)
- Coherent restart message: set up now, no restart — a restart is only an optional later step.
- Confirm the token env-var name before writing any
.envplaceholder. - Verify a sync via the structured result and the
statustool, never a compound shell command. - Reconcile the two counts the user sees ("N pages mirrored" → "N notes ready to search").
Engine
- rag engine
1.1.1→1.1.2; index schema unchanged (1).
🤖 Generated with Claude Code
v3.2.1 — The One Where Updating Finally Brings The Mirror Along (and Clears the npm Vulns)
A bugfix release that makes engine updates actually deliver the flagship feature — and clears every npm vulnerability.
What it fixes
Before v3.2.1, updating a brain to v3.2.x copied the local-mirror code but never installed its skill nor registered its MCP server — so only a fresh install got the feature. Upgraders silently missed it.
Now, an engine update:
- Installs missing engine-declared skills (install-if-absent) — a brand-new engine skill (e.g.
local-mirror) reaches upgraders, while a custom/already-present skill is left byte-identical. - Reconciles
.mcp.jsonfrom the manifest'sengineMcpServers— registers a newly-shipped engine server, preserving existing engine/user servers. - Names what it delivered in the update summary, so you see you finally have the feature.
- Clears all npm vulnerabilities (0 vulns on
rag/andlocal-mirror/).
Safety
Your notes, .env, constitution, settings and custom skills stay untouchable by construction — only manifest-declared engine assets are written, and only when absent.
ℹ️ Brains already on ≤v3.2.0 self-heal over two update cycles (run 1 installs the new logic, run 2 runs it) — documented in the
update-engineskill + ADR 0025.
v3.2.0 — The One Where Notion Moves Into Your Brain
Your brain can now mirror a live Notion zone into its own vault — as clean, searchable, citable Markdown — so it answers from that zone framed, sourced and offline, with no copy-paste and no manual reindex. The central RAG your company doesn't have yet — but local, and right now.
👥 Who is this for?
- 🌱 New here — you've never installed a second brain. Install and go: you get a private, local, RAG-powered second brain out of the box. Local mirrors are there the day you want your brain to also search an internal Notion zone — nothing to set up until then.
- 🔄 You already run a second brain. Update its engine with the
update-engineskill (opt-in, never touches your notes), then just ask your brain to "mirror this Notion zone locally" — the new/local-mirrorskill walks you through it. - 🏢 Your team lives in Notion and there's no central mcp/search. This is the local-first answer in the meantime: your own brain mirrors the zone that concerns you and indexes it locally — zero infra, works today.
✨ New — mirror a Notion zone into your brain (/local-mirror)
Point your brain at a Notion root page, share a read-only integration with it, and the whole sub-tree becomes first-class notes in your vault — searchable semantically, cited, offline. No special vocabulary: ask in plain language, in any language.
- "mirror the product zone from Notion locally"
- "make my brain able to search this Notion"
- 🇫🇷 "mets en place un miroir local pour ce Notion" · "réplique cette zone Notion en local"
- "refresh my product mirror" / "is my mirror behind?"
A one-way local copy kept for the offline RAG: copied once, then refreshed on demand. Under the hood — delta sync via watermark, content-hash no-op skipping (an unchanged page rewrites/reindexes nothing), deletion reconciliation, atomic vault writes, clickable internal Notion-page links, and child-database extraction so DB-backed pages aren't mirrored empty.
Six tools, driven conversationally by the skill:
| Tool | What it does |
|---|---|
setup_source |
Interactive onboarding: tests the scope, first sync, guides the token into .env (never through the chat) |
sync |
Delta sync + deletion reconciliation for one mirror or all |
check_freshness |
Light watermark-only check — is it behind, and by how much? (pulls nothing) |
status |
Last sync, watermark, item count, lateness |
list_sources |
All declared mirrors + their state |
remove_source |
De-register, optionally clean up the folder + sidecar |
The skill also disambiguates up front: durable / offline / citable → a local mirror; one-off / live / right now → the native Notion connector. It only asks when your intent is genuinely ambiguous.
🧭 Why "local mirror" (and not "golden source")
This release renames the concept golden-source-sync → local-mirror (skill, MCP server, persisted names, docs). "Golden source" over-claimed — it implied the authoritative source — and blurred the line with reading Notion live. A local mirror says exactly what it is: a one-way local copy of a chosen zone, kept for the offline RAG. The day a central search platform arrives, you switch over without rewriting anything (same vault contract).
🧩 Architecture — decoupled by the filesystem (ADR 0022)
local-mirror writes and deletes files, full stop. The existing FileWatcher reindexes and the auto-commit hook commits — the mirror server is unaware of the RAG. No tool bolted onto vault-rag, no code link between the two. It's a self-contained pure-JS MCP package (no native deps, no ABI-skew), hexagonal (ports & adapters).
📐 Known limitations (documented, by design)
- Attached PDFs / Google Slides are not extracted — only the page's Notion text is mirrored (flagged at use-time).
- Links to other Notion spaces are not pulled in — only the declared root page's sub-tree is mirrored.
Already have a brain installed? Update its engine with the update-engine skill (opt-in; never touches your notes, .env, constitution, settings or custom skills) — then ask it to mirror a Notion zone.
v3.1.0 — The One That Can Migrate Your Old Second Brain Like Kenjaku (and fixes Node compatibility)
👥 Who is this for?
This release lands differently depending on where you start from — here's the takeaway for each:
- 🌱 New here — you've never installed a second brain. Nothing to migrate: just install and you get a private, local, RAG-powered second brain out of the box. The
importfeature below simply doesn't apply to you yet — you start fresh. - 🔄 You already run a second brain from an earlier version (pre-/around v3.0). Install (or update to) 3.1.0 and use
importto bring all your existing notes into the new one. You keep your content and move it onto the latest engine — no starting over. - 📁 You built your own notes by hand, as a plain Obsidian vault (a folder of Markdown).
importbrings that vault in, so your existing notes instantly gain everything this second brain offers — semantic search / RAG, the skills, the constitution — without rewriting a single note.
In short: first-timers install and go; everyone who already has notes (a previous brain or a self-made Obsidian vault) uses
importto bring them in and unlock the full RAG-powered experience on top of them.
✨ New — bring a previous brain's notes over (import)
Migrate the notes of an older second brain (or any Obsidian-style vault) into this one — safe, opt-in, non-destructive. No special vocabulary: just ask in plain language, in any language, and a native folder picker opens so you can point at your former brain (no path to copy-paste). Examples:
- "migrate my previous second brain" — (you'll be prompted to pick the location of your former second brain)
- "import my old notes"
- "recover / bring over the notes from my old brain"
- 🇫🇷 "importe / migre / rapatrie mes anciennes notes"
- "import my old notes from
<path>" — (give the path directly, if you'd rather type it than use the picker)
It shows a plan first (zero writes), waits for your explicit yes, then copies only your content — never the old engine, .git, .claude or .env. It skips demo notes, never overwrites a name collision, preserves subfolders and accented names, then reindexes so your imported notes are immediately searchable. When indexing finishes, an OS notification lets you know — no waiting blind.
🧬 We nickname it the Kenjaku move — transplanting a mind into a new vessel. (Pure lore; you trigger it with ordinary words.)
🐛 Fixes
- Node compatibility — install no longer refuses a recent Node (24/25/26); too-old (< 20) fails early with an actionable message telling you what to switch to. (ADR 0020)
- SQLite native self-heal — on a multi-Node machine, the search engine now detects a
better-sqlite3ABI skew (binary built under one Node, loaded by another) and rebuilds itself once, transparently — no more "native module broken" at first start. Works on macOS, Windows and Linux. (ADR 0021)
Already have a brain installed? Update its engine with the update-engine skill (opt-in; never touches your notes, .env, constitution, settings or custom skills).
v3.0.0 — The One With The Engine That Will Now Be Able to Update Itself (Without Touching Your Notes) 🔄
📦 How to install — don't download the archives below. Your brain is generated by cloning this launcher, not by unzipping it (the installer reads the repo via
git, so it needs the git history). Follow the README → Install:git clone … && node installer.mjs. The "Source code (zip/tar.gz)" assets at the bottom are added automatically by GitHub and can be ignored.
🔄 The headline: your brain now upgrades its own engine — without ever touching your notes
From v3.0.0, every generated second brain ships with a built-in, opt-in updater (update-engine). Ask in plain words — "update your engine, please" — confirm, done. No terminal, no re-running the installer, no new folder.
- Self-carried updater. The brain carries its own
update-engine+ libs (it can upgrade even the updater). engine-manifest.json= the readable map. Spells out what counts as engine (upgradable) vs what is yours (off-limits), and records where a newer engine is pulled from.- Throw-away errand. Fetches a disposable copy of the newer engine into a temp folder, applies only the engine pieces, deletes the temp folder. Nothing lingers.
- Reindexes only if the index format changed — otherwise your search keeps working untouched.
- Cross-platform parity (macOS · Linux · Windows) is a release gate (ADR 0015).
- Offline version display — the brain can see its own engine version (this git tag) with no phone-home, so it may even offer the update on its own.
Sacred — never touched by an update: your notes, your .env keys, your CLAUDE.md constitution, your settings, and your custom skills.
First clean semver release (ADR 0017).
V1/V2were legacy tags.