Skip to content

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

A Halcyon vault: folders in the sidebar, a list of notes with excerpts, and a note open in the editor.
Native macOS app Plain markdown files Real vim bindings Instant full-text search Works offline Local-first

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.

Halcyon's launcher: the wordmark, the tagline, buttons to open a folder or a file, lists of recent vaults and files, and the chord that opens the keyboard cheatsheet.

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.

All Notes
ideas
work / 2026

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.

~/code/api/README.md
~/docs/prd-vault-nav.md
~/Desktop/spec.md

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.

NORMAL ci" 3dd qa…q

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
A note in the editor: every line rendered, except the one the cursor sits on, which shows its raw markdown backticks.

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.

The same Halcyon vault in the light theme: pale surfaces with the same magenta and violet accents.

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
Halcyon's editor with a vim ex command being typed at the bottom of the buffer: :rename Getting started
: 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.

~/notes · zsh
$ 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.

A Halcyon vault with sync switched on: folders in the sidebar, a list of notes with excerpts, and a note open in the editor.
Sync is on in this window, and nothing else about it changed. The same folders, the same files, the same editor that still works with the network off, while the second Mac catches up on its own.

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.

Halcyon's version history sheet: five earlier versions of a note listed on the left with their times and sizes, beside a read-only rendered preview and a Restore this version button.
Every sync pass leaves the version behind it, kept 30 days and encrypted the same way the notes are. Restoring one writes it back as an ordinary edit, so going backwards never destroys the thing you went back from. Two Macs editing the same note land here too: the newer edit becomes the note and the one it displaced waits in this list, rather than turning into a 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.

Halcyon for iPhone

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.

Halcyon's command palette open over a vault, listing every command beside its keyboard chord.
⌘K finds any command, and prints the chord next to it. Use it for a week and you won't need it.

Worth memorising first

Command palette ⌘K
New note, in the selected folder ⌘N
Cycle edit / split / preview ⌘E
Search note contents ⌘⇧F
Open a file, in its own window ⌘O
Open a folder, as a vault ⌘⇧O
Move between panes, tmux-style ⌃h ⌃l
Settings, including remapping any of these ⌘,

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

Halcyon's keyboard cheatsheet in four columns: anywhere, the note list, the editor's leader keys, and ex commands.
⌘⇧/ in the app, generated from the same table the key handler reads, so it can't drift from what the keys actually do.

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.

I'll send one email to check it's really you. After that, how it's going, the odd question about what to build next, and nothing that isn't worth reading. Unsubscribe whenever.

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.