The thing you keep saying.
“…without realizing you're saying the same thing.”
Tight clusters of notes converging on an unnamed through-line. The centroid's load-bearing sentence is the proxy thesis.
shipped · v0Standalone · Read-only · Local-first
Basalt reads your Markdown vault and surfaces what you believe but never wrote down — the claim from six months ago that the last four weeks of work depend on. It sits on top of whatever you already have. No methodology to impose.
The wedge
Basalt is the only second-brain compiler in this category that keeps all three at once.
Standalone Python. It runs on your laptop without Claude Code, Cursor, or any editor plugin in the loop.
Your notes are the substrate — read from disk, never moved, never modified without consent. A mirror, not a profile.
Embeddings are computed by your local Ollama. The index lives at ~/.basalt. No request leaves your machine in the Open tier.
Cognitive verbs
Each verb is one operation over your link graph and embeddings. The signature output is The First Brief — citation-grounded, every section ending in a one-click commit.
“…without realizing you're saying the same thing.”
Tight clusters of notes converging on an unnamed through-line. The centroid's load-bearing sentence is the proxy thesis.
shipped · v0“…you wrote and forgot you disagreed with yourself.”
Same-topic pairs whose load-bearing claims carry opposing markers — ship ↔ kill, works ↔ broken. Candidates, not verdicts.
shipped · v0 heuristic“…what you say matters versus where the week went.”
Project-folder structure against daily-note mentions over 30 days. Surfaces the largest divergence — your stated #9 is your lived #1.
shipped“…that turn out to be the same idea.”
Notes across different top-level folders, no wikilink between them, embedding similarity ≥ 0.78. The link you never drew.
shipped“…that recent work quietly keeps citing.”
A claim you haven't returned to, that newer notes still link to — explicit links plus semantic validators. The bonus fifth unlock.
shipped · bonus“Run every shipped verb in a single pass.”
basalt brief --section all compiles a longitudinal model of you — claims, drift, theses — under 90 seconds on a 1,500-note vault.
the signature outputThe Brief
Every finding quotes the exact sentence, names the file, and dates it. You can open the note and check. The same output renders in the terminal and in the desktop app.
THE BURIED INSIGHT ───────────────────── vault age: 244d · age≥122d dormant≥40d recent≤122d On 2025-09-12 you wrote, in 02-Projects/SignalBot/HYPOTHESIS.md: The sustainable edge isn't speed alone — it's speed + intelligence. (callout body) Since then, 4 notes link back. You haven't returned to this claim since. → 02-Projects/SignalBot/PHASE2.md (2026-03-14) → 02-Projects/SignalBot/BACKTEST.md (2026-03-21) ≈ 02-Projects/SignalBot/CALIBRATION.md (0.83) ▸ Promote to thesis ▸ Open all ▸ Snooze
Calibration layer
Every finding ships with a falsification rule — a verifiable way it could be wrong. Run basalt audit weekly and your track record compounds. This is the line between a research log and a summary tool.
“…no new note cites this claim in 60 days.” “…you link these two and the link reads as forced.” Each finding sets an expectation you can check against the vault later.
The audit walks every pending finding, applies its rule, and updates the verdict. Your record fills in over weeks — not minutes — and it's shown at the top of every Brief.
The desktop app
A native app for Windows and macOS — a front-end for the Basalt CLI. The same engine, the same read-only promise, with a clean onboarding and the Brief rendered as a workshop shelf you can browse.
On an Intel Mac? Download the x64 build.
pip install basalt-vault (Python 3.12+, plus Ollama
for indexing). Without it, the app still opens the bundled demo.
CLI setup →
No setup wizard theater. Two equal-weight paths — bring your vault or open the demo — and a plain line about where your data lives. Privacy stated, not sold.
The CLI
Prefer the terminal? Basalt is a standalone Python package. The interactive wizard handles setup, and the JSON output pipes straight into jq or an MCP client.
INSTALL
pip install basalt-vaultSET UP & INDEX
basalt initbasalt indexbasalt brief --section allOR TRY IT FIRST — NO VAULT NEEDED
basalt demoTHE COMMAND SURFACE
| init | interactive first-run setup |
| index | walk the vault, build the link graph, embed |
| brief | every verb, or one section, top N |
| connection / drift | convenience subcommands per verb |
| audit | re-evaluate pending findings, score the record |
| doctor | five-row health check, exits non-zero on red |
Basalt also exposes its verbs as an MCP server, so Claude Desktop, Cursor, Cline, Zed, or VS Code can call them as tools. pip install 'basalt-vault[mcp]'
How it works
Privacy posture
The moment a tool owns your self-reflection data, it stops being a mirror and becomes a profile. Basalt is built so it can't.
Benchmarks
From a working 2,022-note Obsidian vault. The cache means daily Briefs after the first index are near-instant.
| Step | Cost | Notes |
|---|---|---|
| Parse + link graph | 1.1s | 2,022 notes / 9,284 links — pure Python, deterministic |
| Embed (first run) | 143.5s | 636 uncached notes, 6-way concurrent (~4.4 notes/sec) |
| Embed (cache hit) | 0s | content-hash cache — unchanged notes skip the network |
| Brief — one section | ~1–2s | reads from SQLite + numpy; no embedding at brief-time |
| Brief — all sections | ~5–10s | connection + implicit thesis dominate the pairwise scan |
| Audit | <1s | SQL-only — no model calls |
Tiers
The free tier is generous enough that trust builds before money enters.
Open
Everything that runs without a network call.
Pro · planned
LLM synthesis on top of the Open engine.
Get Basalt
Start with the CLI in sixty seconds, or download the desktop app for Windows.
pip install basalt-vaultThe Windows & macOS apps are front-ends for the CLI — install it too.