local-first · open source · macOS

the second brain
your AI can operate.

Notion-grade databases and dashboards — as plain markdown on your disk. No account. No cloud. Nothing between you, or your agent, and your own files.

DOWNLOAD FOR macOS view source
01 / structure ↓
or skip to the app →

01 / structure

give a note a type:
it becomes a database row.

A “database” is every note with the same type: label at the top of the file. Table, board, list, gallery — same files. Nothing ever moves or converts.

02 / operation

an agent isn’t a feature here.
it’s a user.

Claude, a cron job, you in a terminal — every user works the same plain files, through the same door. Those pulses? Writes, landing. The app just watches the disk.

03 / computation

then the files start
computing.

Sheets are plain-text tables with formulas. Dashboards bind stat cards, charts, and live views to the results. No other markdown tool builds that in — and every number traces back to a file.

04 / ground

underneath it all:
plain files on your disk.

Delete Substrate tomorrow and you lose nothing — the vault is a folder of readable markdown. No migration, no lock-in, no trust required.

05 / the app

This is Substrate.

A real vault: notes on the left, live-rendered markdown in the middle, properties on the note. The sidebar’s “databases” and “dashboards” are just files like this one, grouped by their type: label.

The whole app — sidebar with databases, notes list, live-rendered editor The calendar — event and task chips on a month grid, overdue rail underneath, every chip a file The calories dashboard — net kcal, weekly bars, a log form, all bound to two markdown files

~/Vault · a working vault · databases in the sidebar, notes in the middle, live-rendered markdown right

06 / surfaces

Dashboards over text files.

Stat cards, charts, live views, a log form — a real dashboard, and every number on it is derived from markdown files on disk. This one tracks yield:

The Yield APR dashboard — realized APR, projections, per-interval chart, a log form

Yield APR.md · realized APR, projected yield, per-interval chart — every number derived from snapshot rows in the file

Where do the numbers come from? Sheets — formula tables in plain text. This is a whole one:

zsh — ~/Vault⏎ 0
$ cat Finance/Holdings.md
---
type: sheet
---
```csv
asset,bucket,units,price_usd
WORLD-ETF,etf,30,98.5
BTC,crypto,0.08,64200
```
```formulas
value_usd = units * price_usd
total  = SUM(value_usd)
crypto = SUMIF(bucket, "crypto", value_usd)
value_eur = value_usd * FX("USD","EUR")
```

A spreadsheet that is also just a note.

That file is a working portfolio tracker: the rows are holdings, the lines below compute value, totals, and how much is in crypto — SUM, SUMIF, live currency rates, references across sheets. In the app you see a grid and charts; on disk it stays a note you could email to someone.

This layer simply doesn’t exist elsewhere: Notion’s formulas compute one row at a time — anything across rows or tables means rigging relations and rollups, and charts can’t read the result. Here a full spreadsheet engine runs over files grep can read.

SPEC — docs/sheets-spec.md · ENGINE TESTED IN CI

And this is the same kind of file, open in the app — the csv rows become a grid, the formulas become the totals rail underneath:

The Holdings sheet open in Substrate — csv rows rendered as a computed grid, formula totals along the bottom

Holdings.md · the sheet rendered · totals, per-bucket sums and USD→EUR conversion computed from the file, live

07 / cookbook

Don’t start from a blank vault.

The repo ships a cookbook of dashboard recipes — each one a folder of plain markdown: the dashboard note plus the sheets and sample rows it binds to. Copy the files into your vault and the board renders with numbers on first open. That’s the whole install.

The food-log recipe rendered in Substrate — net kcal, goal band, week bars, a log form

cookbook/food-log/ · three markdown files, copied in — the tracker above is what opens

8 recipes

Real boards, not demos

Portfolio cards, APR tracker, food log, curated news feed, home hub, release charts, a label-accounting workbook, a work index — grown in daily use, then genericized.

tested

Pinned to the demo vault

Every recipe file is byte-identical to examples/vault/ and parsed by the same engine code in CI — a recipe that drifts fails the suite.

agent food

An index your agent can read

cookbook/index.json declares each recipe’s files, what it expects, and how to adapt it. “Set this up against my real data” is a one-line prompt.

08 / files

The files are the app.

No proprietary database underneath — the markdown on your disk is the only source of truth. Substrate is just a fast window onto it. Edit a file in any other app and the change is live before you switch back.

zsh — ~/Vault⏎ 0
$ cat Contacts/Noa.md
---
type: contact
role: artwork
status: active
---
Brief sent for [[Slow Bloom EP]] —
stems for the motion piece due Friday.

# a text file. also a database row.

$ echo "- [ ] send stems to Noa" >> Today.md

Every note is a page anything can open.

That terminal is showing a contact card — and it’s just a text file you could read on any computer made in the last forty years. The labels on top (type, role, status) are what make it a database row. Change the file from anywhere — another app, a script, that echo line — and it’s in Substrate before you switch back.

FOR THE NERDS: FRONTMATTER IS THE SCHEMA, GREP IS A QUERY ENGINE — docs/vault-format.md

09 / agents

Agents don’t get an API here.
They get the files.

No UI-only data, boring parseable formats, external edits picked up live — an agent filing your inbox at 3am is a designed use, not a hack. And once agents can read everything on your machine, a vault that never leaves it uninvited stops being a nerd feature and becomes the point.

Not “AI-powered.” Legible.

There’s no model inside Substrate and no tokens to buy. The claim is stronger and cheaper: the vault is plain text with documented conventions, so any agent — Claude, a cron script, you in a terminal — can read and write it directly.

EVERYTHING THE UI DOES TO YOUR DATA IS ACHIEVABLE BY EDITING FILES.

agent — claude~/Vault
agent › file today's captures
read   Inbox/ — 4 untyped notes
write  type: contact → Contacts/Noa.md
write  type: release → Releases/Vessel Songs.md
write  type: task ×2 → Tasks/
vault › watcher: 4 files changed, index live

10 / features

Narrow, but finished.

A smaller surface done properly beats a wide surface at 80%.

captureOne keystroke from any app — ⌥Space drops a thought into the Inbox. Filing is a decision for later, or never.
palette⌘K opens anything, creates anything, runs anything. ⌘1–9 jump views, j k walk lists.
searchFull-text over the whole vault, indexed in Rust, results as you type — instant at a 2,100-note vault.
editorLive-rendered markdown — raw syntax only at the cursor. No block editor; blocks are the cost swamp that makes Notion slow.
databasesTyped properties, four views, saved views, templates, inline editing — over the same plain files.
sheetsWorking spreadsheets — SUM, SUMIF, cross-sheet references, live FX. Notion’s formulas stop at one row; these don’t.
links[[Wikilinks]] and backlinks across the whole vault — ⌘-click a note that doesn’t exist yet, and now it does.
dashboardsStat cards, charts, and live views bound to sheet formulas — all plain text.
local realityIndexes real folders on disk — money, projects, masters. Cloud tools can’t see your machine.
historyEvery note edit versioned in local git. Deletes go to trash, restore is one click, only explicit purges are permanent.
syncVault-to-vault git sync today — notes and settings, your own Mac as the remote, no third party in the path. End-to-end encryption is the committed design: any future relay moves ciphertext it cannot read. iOS build in active development.

11 / only here

Things you can’t take elsewhere.

The claims that don’t have a Notion/Obsidian equivalent — every one shipped and checkable in the repo. The full register, including what’s deliberately not advertised yet, lives in docs/differentiators.md.

the contractA 2,200-line on-disk spec written for external writers — plus vault doctor, a read-only integrity report. Your agent gets documentation, not reverse-engineering.
audio rowsWaveforms and play buttons inside database views — native, zero-config. A folder of demos is a playable database.
notificationsA date+time property fires a real notification — snooze, recurrence, DST-safe. Notes apps don’t do this; task apps don’t own your notes.
repeat:repeat: every 3 weeks in plain frontmatter — no RRULE anywhere. One file, many occurrences; delete offers this-one / following / all.
workbooksAny dashboard grows spreadsheet-style bottom tabs — sheet grid, dashboard, database cut — all in one file.
purgeDeletes are recoverable — but an explicit purge rewrites history and is physically gone. Accidents removable, not hidden.
conflictsA conflicted sync pull refuses — markers never land in a note. Per file: keep mine, take theirs, keep both; a half-resolved merge survives quitting.
send as linkSeal a note AES-256-GCM in the app, key only in the URL fragment, relay you host yourself — burn-after-open or timed expiry.
terminal⌘⇧T drops a real shell into the notes app — with PTY trust checks, because that sentence should scare you a little.
exit rampsIn: Notion export lands as typed rows, date ranges intact. Out: PDF, portable markdown bundle, CSV exactly as the view shows. Both directions paved.

12 / principles

Built on a few stubborn ideas.

01

Files are the only truth.

Export a PDF to send someone, sure. But you’ll never need to export your data — it was never inside.

02

Nothing phones home.

No account, no telemetry, no cloud — your vault never leaves your machines uninvited. The only outbound calls are features you can see: currency rates for sheets, titles for pasted links.

03

Speed is a feature, not a benchmark.

The app should feel like a room, not a machine.

04

Agent-native, by design rule.

Boring formats, documented conventions — the agent uses the same door you do.

05

Built for one person first.

Not a product committee — a daily driver. Every feature exists because someone needed it that week.

$ don’t trust the copy — read the source

13 / switching

Leaving Notion?

The databases, the views, the everything-in-one-place — minus the loading spinners, the vendor account, and the API between your agent and your own notes.

1

Export from Notion

Settings → Export all workspace content (markdown & CSV).

2

Drop it in your vault

Pages are markdown already — notes the moment they land. Database rows arrive as CSV; typing them as frontmatter is the real migration.

3

Migrate one database at a time

Lane by lane — each database lands whole before the next begins. No big-bang cutover.

honesty clause: Notion is still better at real-time multiplayer collab. Substrate is single-user by design — that’s why it’s fast.

14 / price

Free and open source. That part’s simple.

Build from sourcefree forever — every feature, no gates
App Store build, latera few euros — signed, one-click; funds development
Hosted sync, lateroptional — the self-host path stays documented

Same app, same features, your call. A donation nag may appear someday, rarely — one euro makes it disappear forever, and with the source right there you can always build the version without it.

15 / faq

Fair questions.

Where is my data, exactly?

In ~/Vault (or any folder you choose): ordinary text files you can open in anything, plus a small .vault/ folder holding your database settings and saved views — also plain text. You can read all of it right now, no Substrate required.

Isn’t this just Obsidian?

Closest neighbor, different bet. Obsidian answered “who owns the files?” — Substrate starts there and asks what the files can do. Four differences that compound:

core, not plugins. In Obsidian, structure is assembled — Bases for tables, plugins for sheets and dashboards, each with its own format and update cycle. Here typed databases, sheets, and dashboards are one native core: one documented convention, no stack to keep standing.

computation. Sheets are formula tables in plain text; dashboards bind stat cards, charts, and live views to the results — a spreadsheet-and-dashboard layer Bases doesn’t reach. Your finances, your release pipeline: computed, not just collected.

agent-first, not agent-tolerant. Both are “just files,” but here the conventions are designed to be operated: documented spec, boring YAML, external edits as the designed path — the index is live before you ⌘-tab back.

open source. Obsidian is free but closed. Every claim on this page is checkable in the repo.

What happens if the project dies?

Nothing. Your vault is markdown — every editor on earth opens it. That is the whole point of building on files instead of a database.

Does it phone home?

No telemetry, no analytics, no account, no update pings you didn’t ask for. Two boring exceptions, both user-visible features: sheets fetch currency rates, and pasting a URL fetches its title. The source is open so you don’t have to take our word for it.

Is the App Store build different?

No — same app, same features. It’ll pay for the signed one-click install and support development. The listing will say exactly this.

iPhone? Windows? Linux?

macOS first. An iOS build is in active development — it syncs directly to your own Mac, no third party in the path; end-to-end encrypted relay sync is the committed design. Windows/Linux aren’t planned — the roadmap follows its owner’s needs, honestly stated.

get substrate

your notes. your disk.
your agent’s hands.

One folder of markdown. Databases on top. If you ever leave, you take everything.

DOWNLOAD FOR macOS view source