slate

plain-text notes · keyboard first · yours on disk

A local-first Markdown editor with a focused interface: one modal overlay, monospace type, a single accent colour, and a binding for everything. Your notes are ordinary .md files in an ordinary folder — openable by anything, greppable, git-able, and still yours the day slate stops existing.

Apple silicon · macOS 11+ 20 themes A calculator on every line Clipboard history from any app End-to-end encrypted sync Bring your own AI, or none Works offline, always
notes 12
Thu 09:14❄ −2°
⌕⌘ opus-5

---
tags: [field, weather]
---

Thursday

Read snow as snow, not as a shower. The block wears its weather now — wx: in the frontmatter and the icon resolves at paint time.

A layout bug can be a network bug when a measure is in ch.

Today

  • Narrow the tree, reorder it, never leave the sidebar
  • Convert the XBM icons to path data
  • Write up [[the CSP rule]]

Filed under #field · see also [[weather blocks]] and **the shipping log**.

SAVED 214 words ~1 min ⎇ 2 links ← 3 backlinks ✦ opus-5 ⇡ synced 2m ago Everforest slate 0.2.0
The whole app. A top bar with the time and the sky, a tree, the note, a status line — and nothing else. Press ⌘\ and the sidebar goes too.

01 What it is

Three commitments, and everything follows from them.

slate is not a database with a Markdown skin. It is a folder of text files with a very good editor pointed at it — which is why every decision below was easy.

01

Plain text

Your vault is a directory of .md files. Wikilinks, tags, frontmatter, tasks and tables are all just characters in the file. Rename a note and inbound [[links]] are rewritten; delete slate and nothing is trapped. There is no export because there is nothing to export from.

02

Keyboard first

Every command has an id, a palette entry, and — where it earns one — a binding. Space opens a which-key leader menu so the chord vocabulary is discoverable rather than memorised, and ⌘/ lists the lot, grouped. The mouse works. It is never the fast way.

03

Yours on disk

Files are read and written straight to the folder you picked, with no server in the path. Sync is optional and end-to-end encrypted — the server stores ciphertext it cannot open. Offline is not a degraded mode; it is the normal one.

02 Early access

slate is in a small beta.

Testers are let in in small waves, so every piece of feedback gets read and acted on. Tell me a little about how you take notes now, and you'll get an email when your spot opens.

  • Mac app (Apple silicon) and the web build
  • The same vault in both, synced end to end encrypted
  • Five questions, about a minute

No newsletter. One email when you're in, then a weekly one-question check-in you can stop any time. See the privacy policy and terms.

03 Start here

Five minutes, and the only thing you have to decide is which folder.

Point it at a folder

Choose Open a folder… — empty, or full of notes already. That folder is the vault, and slate adds no hidden database beside your files. Not ready? Try a demo vault runs in memory and writes nothing to disk.

Learn four keys, not forty

⌘K finds anything. ⌘P runs any command. ⌘⇧F searches the vault. Space opens the leader menu and shows you the rest. ⌘/ lists every command with its live binding.

Write like it's a text file, because it is

Markdown as you type. [[wikilinks]] autocomplete and rename with their target; #tags are indexed vault-wide. Backlinks sit at the foot of the note as one dim row.

Make the daily note your inbox

⌘⌥D opens today. ⌘⇧↵ logs the line you're on into it from anywhere in the vault. The Chrome clipper lands in the same place.

Turn on sync, if you want it

One command, an account, and a vault password that never leaves the device. Optional, per-vault, and end-to-end encrypted — the details are in §11.

notes
projects/slate.md
⌘P

slate

One modal overlay, monospace type, a single accent colour, and a binding for everything.

  • Ship the desktop build
  • Sign it
> the — run a command commands
Theme
Change themelive preview⌘⌥T
Cycle to next theme20 themes
Navigate
Jump to headingoutline⌘⇧O
All tasks in vaultrollup
Vault
Connect the Clipper browser extensionchrome
↑↓ move↵ runesc close ⌘P
SAVED 86 words Everforestslate 0.2.0
One overlay, five modes. Files, commands, search, outline and tags are the same box wearing a different sigil — >, /, @, #. Learn it once.

04 New in slate · Mac

The clock, the clipboard and your voice, all a chord away from any app.

The top bar holds instruments: the time, the sky, what's coming up. Behind them sit tools you'd otherwise keep in separate menu-bar apps — each one reachable from any app, each one leaving your notes as plain files.

  • Clipboard manager. ⌘⌃V — everything you've copied from any app, text and screenshots. Images land in the vault as files, not base64.
  • Screenshot to text. Copy an image, run Extract text from clipboard image, and the words drop in at the cursor. On-device, no upload.
  • Dictation. ⌘⌃⇧D starts and stops. The transcript lands as one undoable edit, transcribed locally through Voxtype.
  • Reminders. ⌃⌘R asks for minutes and a message; they stack in the corner and survive a reload.
  • Weather, and seven clock faces. The icon is the sky, down to tonight's real moon phase. Hover for three days; right-click the clock to change its face.
  • Music. Play, pause, skip and playlists by name, from the bar or the palette, through Cliamp.
Nothing is bundled. Dictation and music are optional companions — installed only when you press the row that says so, and removable to the Trash.
notes 123
Thu 14:32☁ 18°
⌕⌘ opus-5
♪ lofi⏲ 2 ● rec

Saturday

Call notes, dictated on the walk back.

⎘ search what you copied clipboard
Today
Screenshot 2560×1440now
git push origin main4m
https://www.slatenotes.app12m
Ship the signed Mac build1h
image · 412 KB
↵ paste⌘↵ copy⌘⌫ forget ⌘⌃V
DICTATING voxtype Everforest
Over any app, not just this one. The clipboard opens as a palette with a preview column. Music, reminders and dictation slide out from under the clock, and the clock turns accent while you're dictating.
01

Select a handful of notes

Shift-click notes in the tree to pick them up as a group, then drag, move or delete them together. A plain click or esc lets go.

02

Moves you can take back

Drop a note in the wrong collapsed folder and slate says where it went, with an Undo — the same safety net a delete already had.

03

A task board, and a timer

Every checkbox in the vault in one window; ticking one edits the note it came from. Beside it, a countdown you can read across a room that logs focus time to today.

05 Terminal plugin · Mac

Your notes and your shell, side by side.

Open a real interactive terminal beside the note you are working on. It starts in the current vault, follows slate's theme and type settings, and stays inside the pane system you already know.

  • A real shell. Full PTY — interactive commands, colours, prompts, Ctrl-C and Ctrl-D. New sessions start at the open vault.
  • Dock it or float it. Beside a note, in another pane, or a floating window with ⌘⌥F.
  • Permissioned, and Mac only. Shell access is an explicit plugin permission, and each session dies with its terminal.
Open it from Plugins. ⌘⇧P enables Terminal — and browses the plugin catalogue, where everything is sandboxed, checksummed, and switched off until you grant what it asked for.
Terminal
~/notes
plugin
terminal dock · float
slate ~/notes % pwd
/Users/you/notes
slate ~/notes % rg "ship" projects
projects/slate.md
18:- [ ] Ship the signed Mac build
32:- [x] Ship the terminal plugin
slate ~/notes % git status --short
M projects/slate.md
# ordinary files, ordinary tools
slate ~/notes %
RUNNINGzsh Everforestvault cwd
Native underneath, slate everywhere else. The shell is backed by a native pseudo-terminal while its colours, font, focus and window controls belong to the app.

06 Keyboard shortcuts

A binding for everything, and a menu for the rest.

Some keys differ between the app and a browser tab, because the browser owns them. The binding slate shows you is always the one that works there. Nothing has to be memorised first: Space shows you the chords, and right-clicking a note or folder in the sidebar gets you the same verbs with the mouse.

Navigate

Find notes, commands, tags, panes, and desks⌘K
Command palette⌘P⌘⇧P
Search the vault — tag: path: "phrase" -exclude⌘⇧F
Browse every tag in the vault — listed in ⌘K under #palette only
Jump to heading⌘⇧O⌘⌥O
All tasks in the vaultpalette only
Back⌘[⌃O
Forward⌘]⌃I

View

Toggle sidebar — ⌘B belongs to bold⌘\
Show everythingpalette only
Hide the file treepalette only
Zen mode — the chrome fades, the window stays⌘.
Cycle view mode — everything → no file tree → note only⌘⌥V
Full screen — its own axis, so every key above still works in it⌃⌘F⌘⌥⇧V
Change theme — live preview while arrowing⌘⌥T
Cycle to the next themepalette only
Manage pluginsSpaceX
Dock or float this pluginSpaceWF

Notes & vault

New note⌘N⌘⌃N
New note from a templateSpaceM
Today's note⌘⌥D
Log this line to today⌘⇧↵
Clipboard history — system-wide on the Mac app, so it opens from any app⌘⌃V
Rename note — rewrites inbound [[links]]⌘⇧Rpalette only
Open vault folder…⌘OSpaceO
Sync this vault now⌘⌥S
Save now — it already saved⌘Sautosaves

Format

Bold · italic · inline code⌘B⌘I⌘E
Strikethrough⌘⇧X
Link to a note⌘⇧K
Cycle heading level⌘⇧H⌘⌥⇧H
Paragraph — clear the heading⌘0⌘⌥0
Numbered list · bullet list⌘⇧7⌘⇧8
Task checkbox⌘⌥B
Blockquote · code block · table⌘⇧.⌘⌥E⌘⌥G

AI — only if you connect one

The AI console — every action in one popup⌘⌥K
Pick an agent · pick a model⌘⌥A⌘⌥M
Continue writing at the caret⌘⌥↵
Rewrite the selection⌘⌥R
New conversation — a chat note in a split⌘⌥C
Send this turn⌘↵
Run a prompt from prompts/*.mdAI console
Stop the stream⌘⌥⌫

Panes & desks

Power grid — opt in from the shortcut sheet; conflicts with VoiceOver's default modifieroff by default
Split beside · below · close — no prefix, always live⌥⇧↵⌥↵⌥esc
Close pane · maximize pane⌃⌥W⌃⌥F
Focus a pane — vim directions, or arrows⌃⌥HJKL
Focus a pane — arrow directions⌃⌥←↓↑→
Move a pane⌃⌥⇧HJKL
Resize a pane · equalize⌃⌥⇧←→⌃⌥0
Go to a desk⌃⌥Space
Desk 1–9⌃⌥1…9
Keyboard shortcuts — every command, grouped⌘/

The leader menu

Space on its own opens a which-key hint menu. Keep holding the thought; the menu tells you the letter.

SpaceF go to note SpaceS search SpaceP commands SpaceD today SpaceN new note SpaceM from template Space⇧M insert template SpaceJ headings SpaceK tasks SpaceL connections Space⇧L map SpaceH history SpaceT theme SpaceE sidebar SpaceZ zen SpaceG full screen Space⇧V cycle view SpaceV split right SpaceQ close pane Space= equalize SpaceO open vault SpaceX plugins SpaceW… plugin windows SpaceA agent SpaceI continue writing SpaceR rewrite SpaceC chat Space? all shortcuts
Every binding is yours to change. Commands are addressed by id, so a rebinding survives a rename — and slate refuses a key the platform already claimed rather than silently losing to it.

07 Numbers in a note

End a line with = and the answer appears beside it. It is never written into the file.

A note is prose first, so the trigger is deliberate — the line has to end in an equals sign. “The deal closed at 3” never lights up.

  • The answer is a rendering, not a rewrite. The file still says 82 + 55 =. Click an answer to copy it, or run Insert calculation results to write them all in at once.
  • Name a value with a colon — guests : 5 — and every line below can use the name.
  • Units are checked, not guessed. 5kg + 3lbs in lbs converts; 3 apples + 2 hours stays blank rather than inventing a number.
notes
projects/thanksgiving.md
zen

Shopping

guests : 5

guests * 3 =15

12 cups to teaspoons =576 teaspoons

1 tsp + 4 tbsp + 6 cups =301 tsp

350 F to C =176.67 °C

The bill

1,200 * 3 =3,600

10% off 250 =225

$24 USD to CAD =32.88 CAD

Split it evenly and everybody owes 720 —

SAVED 7 answers ↵ copy rates 4h ago slate 0.2.0
Answers sit beside the text, tinted rather than filled — so it reads as the editor answering, never as something the document now contains.

What it understands

Real lines, with the answer slate gives them. A dollar sign in front, a fraction glyph, a question asked in words — all rewritten into arithmetic before anything is evaluated.

Arithmetic & percentages

1,200 * 3 =3,600
sqrt(144) + 2^5 =44
200 + 15% =230
10% off 250 =225

200 + 15% means fifteen percent of the thing on the left — the reading on every receipt.

Units, time & the kitchen

5ft + 3in in cm =160.02 cm
90 km/h to m/s =25 m / s
350 F to C =176.67 °C
1½ cups in ml =354.88 ml

Length, mass, volume, speed, time, data, temperature — and US spoons, the ones in your drawer.

Money & variables

€50 to USD =54.35 USD
0.5 BTC in USD =live
day rate : 850a definition
day rate * 12 =10,200

ECB rates for fiat, CoinGecko for crypto, fetched only once a line names a currency — and a failed fetch says so.

Every form it accepts, in full →

08 History & connections

A time machine that is just files — and a diff, so going back is something you read first.

Local-first apps usually give up the one thing hosted apps do well: what did this say last Tuesday. slate's answer isn't a server. The version a save is about to replace is written into .slate/history/ — inside your vault, skipped by the file tree, travelling with the folder like everything else.

  • Press ⌃⌥Z and this note's versions appear, newest first — just now, 4 minutes ago, yesterday — with a line diff beside them, so restoring is something you read first.
  • Only the past is stored, at most one snapshot every two minutes however hard you're typing. history: 30 in slate.md sets the depth; false turns it off.
  • Synced vaults get the other kind too. Revisions the server holds join the same list, marked on this device or synced — still ciphertext to it, still decrypted only here.
Past versions
field-notes/2026-08-28.md
⌃⌥Z
↺ filter 14 versions history
just now+2 −1
14 minutes ago+3 −1
2 hours ago+1
yesterday+9 −4
3 days ago+12
2026-08-19+40
28 Aug, 09:41 +3−1
 # Thursday
6 unchanged lines
−- [ ] Convert the icons
+- [ ] Convert the XBM icons to path data
+- [ ] Write up [[the CSP rule]]
 
+Filed under #field
↵ restore this version↑↓ compare ⌘↵ open in a pane
SAVED 14 versions · .slate/history slate 0.2.0
Lines, not characters. A note is edited in paragraphs, and a line diff is the one that still reads correctly in a column this narrow. ⌘↵ opens the same list as a pane you can leave beside the note — with what synced from your other machines folded into the same timeline, and the option to keep an old version and the current one.

Connections, in a pane of their own

Three lists beside a note: links out, backlinks in, and unlinked mentions — every note that says this one's name without linking it. One keystroke turns a mention into a [[link]], rewriting the other file where it stands.

When the answer is a shape rather than a list, the map draws the neighbourhood one hop out, links and tags and people each in their own colour. The legend is the filter.

Every name a note answers to

aliases: [MOC, index] in the frontmatter and the note answers to all of them — in the palette, in a [[link]], in the mention scan. Rename it and inbound links are rewritten; the aliases keep working.

09 Also in the box

A dozen more things that earned their place.

Each of these is small, and each one is a file — the test everything has to pass before it ships.

01

Nine desks

Each desk holds its own pane layout. ⌃⌥1–⌃⌥9 to switch — a desk is its number, so ⌃⌥3 means the same place every time.

02

The settings note

There is a settings menu, and it is a note. slate.md in your vault is the settings screen — every switch writes one line of frontmatter, and it travels with the vault.

03

Templates, per folder

Notes in templates/ seed new ones, with {{title}}, dates and tab stops. templates.meetings: Meeting and every note in that folder starts from it.

04

A board, from your tasks

Every - [ ] in the vault as a kanban board — where a column is a tag. Moving a card writes one word into the note it came from. No board database to lose.

05

Diagrams that stay text

A mermaid code fence draws itself in the note — flowcharts, sequences, timelines. Copy it as an image, or copy the source. The file is still a code fence.

06

Cards from a .base

A folder of records — vinyl, books, films — drawn as a grid of covers, sized and filtered by a small YAML file beside the notes. Obsidian reads the same one.

07

Paper mode

A reading light for long notes: warm ground, ink-coloured type, chrome pulled back. Right-click for the warmer variant. It is a preference, not a theme, so your theme survives it.

08

The daily brain dump

Switch it on and the daily note opens with a box for whatever is in your head, before anything else can ask for attention. ⌘⇧↵ adds to it from anywhere.

09

Calendars you subscribe to

Paste the secret .ics URL your calendar publishes and what's coming up sits on the top bar. The URL goes in the OS keychain; a meeting becomes a note in one keystroke.

10

Bring your notes with you

Importers for Obsidian, Notion, Evernote .enex, a plain Markdown folder, or JSON. Images come with them, inlined as files in the vault.

11

Twenty themes, and yours

⌘⌥T previews as you arrow through. A theme is a file, so writing one is editing one — type, spacing, chrome and accent included.

12

Vim mode, if you want it

vim: true in the settings note and the editor takes modal keybindings, loaded only when it's on. Pane directions are vim's either way: ⌃⌥ HJKL.

10 AI, on your terms

Bring your own agent. Or don't — with none picked, every AI command is simply absent.

slate ships no model, no key, and no account for one. Point it at Ollama on localhost, connect OpenRouter without an API key at all, or give it any OpenAI-compatible URL.

  • Nothing is final. The console never touches your note until you press the key that lands the result. A suggested title arrives as a proposal, not a file that renamed itself.
  • You see what you're about to send — the left pane fills in as you type, labelled with its scope and a token estimate, before the request.
  • A conversation is a note. ⌘⌥C writes chats/2026-08-26 0952.md. The transcript is the file: searchable, [[linkable]], editable mid-thread.
  • Prompts are notes. Drop .md files in prompts/ and you've added an AI feature without a release. Keys live in sessionStorage, never in the vault.
AI console
field-notes/2026-08-28.md
⌘⌥K
✦ ask, or pick an action none ▾   opus-5 ▾
scope · none⇡ 0
Nothing from the vault goes with this one — no note, no selection, no search. ⇥ to send the note instead.
Ask anythingnone → insert below
Rewriteselection → replace
Suggest linkslinked → insert below
Suggest tagsnote → apply
Weekly digestvault → note
↵ run⇥ scope⌘↵ land below ⇧esc back to the list
SAVED ✦ opus-5 ⌂ localslate 0.2.0
One popup, not eight. Built-ins and your own prompt notes in one fuzzy-matched list, each row saying where its answer will land before you run it.

11 Sync & the clipper

The server holds ciphertext it cannot open. That is the entire design.

End-to-end encrypted sync

A vault password — never sent — unwraps the key that encrypts every file before upload. Filenames included. Sync is per-vault and selective: exclude a folder, skip attachments, leave plugins behind. Earlier synced revisions of any note come back from the palette.

The trade is stated plainly: nobody can reset that password for you, because nobody else ever had it.

The clipper holds no credential

The obvious build signs the extension in with your account. We didn't: a session grants delete and update on every file, so a compromised extension could destroy ciphertext it could never read. Instead the insert routes through a server-side function, and the extension keeps only a vault id and a public key.

Clips arrive on the next sync, timestamped when they were captured, and drain into your daily note.

Turning it on takes three steps

Sync is off until you ask for it, and it is per-vault — a work vault and a personal one are separate decisions on the same machine.

  1. Create an account from ⌘P → Settings → Sync.
  2. Choose a vault password. Not your account password — it encrypts your notes before they leave, and it is never sent. Keep the recovery code you're shown once.
  3. On your second device, sign in and open a folder. An empty one is simplest. Point it at notes that already exist and slate compares first and asks — it never overwrites without asking.

After that it's automatic: about a second, no saving or closing. Everything about it — the off switch, what travels, your devices, what moved — lives under ⌘P → Settings → Sync.