Markdown notes for macOS
Calm waters for loud thoughts.
A markdown notes app and editor with real vim bindings. Point it at a folder and that folder is
your vault: every note stays a plain .md
file, greppable, git-versionable, and open in Neovim at the same time if that's how you work.
macOS · in development
Why this exists
Every notes app asks you to give something up.
Setting it up turns into a project.
Plugins to evaluate, themes to compare, a vault to define, a config to keep tending. You wanted somewhere to put a thought and now there's a weekend of yak shaving in front of you.
Your notes end up living inside the app.
You can't grep them. You can't diff them. You can't open one in the editor you already have open. Getting them back out means finding an export button and hoping.
Vim mode is usually a costume.
A handful of shortcuts that hold up right until you reach for a text object, a macro, or a count. Then you're back to arrow keys and quietly resenting it.
Plain text still deserves to look good.
Most editors treat that as somebody else's problem. You spend hours a day in this window. Reading in it should be nice, and writing in it should be better than nice.
Notion could do everything except leave my notes as files. I loved Obsidian right up until keeping it configured turned into its own hobby. Bear got the feel right and stopped there. Halcyon is what I wanted instead.
Your notes are files.
A vault is just a directory you picked. Every note inside it is a
.md file you can open in something else
while Halcyon still has it open. No import step, no export step, no proprietary blob you have to
crack open three years from now.
Nothing lives only in the app.
Search across the whole vault comes back instantly, which means there's an index behind it. That index is derived from your files though, never the other way around. Every word you write lands in the markdown on disk first, so the copy that matters is the one you could have written in any other editor.
Three things, one window
Everything you open markdown for. In one app.
Notes you're keeping on purpose. A README you just want to read. A PRD someone dropped in Slack. A spec you're halfway through arguing with. It's all markdown, so it all opens in the same window.
A notes app
Three panes, modelled pretty closely on Bear, over a folder of markdown with fast full-text search behind it. Folders come straight from the paths on disk, so the vault is the hierarchy. There isn't a second one to keep in step.
A markdown reader
Open any README, PRD, or spec from anywhere on disk and read it rendered. No importing, no copying it into a vault first. It gets a window of its own and closes without disturbing whatever you already had open, because you were only reading it.
A vim buffer
The real thing. Operators, motions, text objects, registers, macros, counts,
: ex commands. If your hands already know it,
it works here.
Writing in it
Nice to look at. Better to write in.
You spend hours a day in this window, so it had to be good. Headings, quotes, lists and fenced code are styled in the buffer itself, not just over in a preview pane.
Markdown styles as you type, and the raw markers come back on whichever line the cursor is sitting on, so nothing is ever hidden from you. Split view puts the same buffer next to its rendered output when you want to watch the two agree.
- ⌘E
- Cycle edit → split → preview
- :e :sp :view
- The same three, without leaving the keyboard
- ⌃1 ⌃2 ⌃3
- Collapse panes, Bear-style
Light and dark
Two themes, one palette. Both of them got the attention.
The same neon accents, retuned so they stay legible on a pale surface. Switch with ⌘⇧T when the room changes.
Modal editing
Not a shortcut approximation. A real vim buffer.
I've been living in vim and tmux for twenty years, which is most of the reason this app exists.
Ex commands follow vim's own semantics wherever vim has an opinion, which turned out to be most
places. The note list is modal too:
j,
k,
gg,
G,
dd,
p, and
/ all do what you would expect them to.
↵ or l opens a note;
o opens it and drops you straight into insert mode.
<Space> is the leader.
<Space>f
palette
<Space>/
search
<Space>n
new note
<Space>1 2 3
layouts
: opens vim's own command line, at the bottom of the
buffer where it belongs.
Plain files
Close the app and nothing is trapped. It is still just a folder.
This is the one architectural commitment I made early and haven't budged on: the vault's
.md files are the source of truth and
everything else is a cache of what's already there. Every tool you already own keeps working on
your notes while Halcyon has them open.
$ ls ~/notes
ideas/ work/ meeting-notes.md welcome.md
$ rg "search index" ~/notes
meeting-notes.md:3: Discussed the roadmap and the search index.
$ git log --oneline -- meeting-notes.md
a1f3c9d notes from the weekly sync
$ nvim ~/notes/meeting-notes.md # while Halcyon is open
⌘⇧O
A directory is a vault
Opens in the window you are in. A vault is a place you work, and you switch places.
⌘O
A file is a document
Opens in a window of its own, so a file you glanced at never displaces what you already had.
Sync
The same vault, on your other Mac. Nothing readable ever leaves it.
Turn it on one vault at a time. Contents, filenames and paths are
encrypted before they leave your Mac, under keys that stay in your Keychain and never travel
with them. What arrives on the second Mac is a folder of plain
.md files again, and an edit made over
there lands here as an ordinary change to one of them.
Accounts are invite-only for now, while I build on this and find out what breaks. The feature itself ships in every build, so Settings has a Sync tab either way. Nothing else in the app asks who you are, and a vault you never switch it on for stays exactly where it is.
What the server holds
- The name you gave the vault
- How many files are in it
- How big each encrypted file is
- When each one last changed
- Which file became which in a rename
What it never sees
- Any note's title, filename or path
- A single word of what any of them say
- A key that would open either
- Anything at all in a vault you left alone
It learns the shape of your vault and nothing about what is in it, and both halves of that are true. The name is the one thing stored as you typed it, because it is how your other Mac lists the vault before it can decrypt a byte of it. The app says so at the moment you type it.
note (conflicted copy).md.
There is no key on my side.
Which is the point, and which is also the bill: no password reset ends with me reading your notes, and none of them ends with me recovering your notes either. Halcyon offers a recovery code once, when you switch sync on, and writing that down is the whole insurance policy. Declining is a real answer and nothing nags you about it afterwards.
Losing the key still can't lose the note.
This is where the folder pays you back. Elsewhere the encrypted copy is the only copy, so losing your keys loses the notes with them. Here the vault on disk was never encrypted and never went anywhere: the worst case costs you the server's replica and its history, and your notes are still sitting in the folder you picked, still opening in anything else you own.
The sync documentation has the rest of it: switching a vault on, the six digit handoff that lets a second Mac in, reading the status line, and what it does when it cannot finish.
On iPhone
The same vault, in your pocket.
Halcyon for iPhone is in development, and it keeps the promise this page is built on: your
notes stay real .md files, in folders
you can open in the Files app. It has a page of its own, including a plain list of what it
cannot do yet.
Keybindings
Every command has a chord. Every chord is yours to change.
Nothing in here is mouse-only. If a binding fights the muscle memory you already have, record a new one in settings.
Worth memorising first
Vim's own bindings and the note list's
j/k stay put,
because those aren't mine to reassign.
And then the rest of them
The documentation keeps a copy you can search from anywhere, next to the rest of how the app works.
Early days
It isn't out yet. Want in while I get it there?
I use this every day. It also has rough edges I'm not ready to hand to strangers yet, which is a pretty good description of most things I build on nights and weekends. Leave an email and I'll send word as those edges come off, and again the moment that stops being true.
- Where it runs
- macOS, as a native app.
- Where your notes live
- A folder you pick, as .md files.
- Who it's for
- Anyone who wants more than a text box and less than a second job.
- What's next
- Opening sync past the invite list, and getting the iPhone app through enough hands to trust it.
- When
- Soon. The list hears first.