~/notes

built by digital pilgrim

your markdown notes, from anywhere

a web editor for a directory of markdown files. vim keybindings, a command bar, and git underneath. it never takes the files away from you — they stay on disk, exactly as they were written.

not released yet. it runs, it is tested, and it is one person's notes at the moment. when there is something worth handing over, it will be here.

the files stay files

your notes are markdown on disk, in whatever directories you already put them in. not rows in a database with an export button — the directory is the thing, and this app is a window onto it.

so grep still works. vim still works. rsync still works. close this tab and nothing about your notes has changed.

a save writes the bytes you typed. the one thing it changes is a windows line ending, because a browser sends those and nothing else here wants them. nothing is reflowed, retitled, or tidied.

it is vim, in a browser

modal editing, properly: hjkl, counts, operators, registers, macros, :w. a vertical split with two notes side by side. zz, zt and zb do what they do everywhere else.

~ / garden / tomatoes.md

1# tomatoes
2
3## 6/14/26
4- the san marzanos went in late
5- stake them before they sprawl
6- water early, not at dusk

a plain textarea if javascript is off, saving through the same form to the same place.

a command bar that reads like a shell

cd, e, mv, rm, grep. relative paths, ../ and ~/, and tab completion that shows you the choices and cycles them.

: mv tomatoes.md ~/garden/beds/

garden/beds
garden/beds/raised
garden/beds/shade

it resolves on the server, so the whole grammar still works with javascript off — completion is the part that needs a browser, and it is the only part.

a tree you walk rather than click

j and k move, l opens a folder and h closes it, J and K skip a folder at a time. every row carries a ⋯ for the times you have no keyboard.

~ / garden

▸ beds11
▾ seeds4
catalogue.md62L
saved.md9L
tomatoes.md34L

every save is a commit

the directory is a git repository and this app writes to it like anyone else would. each save from the web is its own commit, scoped to the one file it touched — so there is a history to read, a diff to look at, and an old version to put back.

a removal commits the file before it goes. a move commits both halves. the undo log is git log, which means it is still there when this app is not.

and on a phone

the same pages, narrowed rather than replaced: a listing on a phone is filenames and nothing else, because the screen has room for the name or for the numbers beside it, not both.

the editor keeps vim mode if you want it and turns it off if you do not. every action a keystroke does has a control you can reach with a thumb.

private, by construction

one account. a password and a code from your authenticator, asked for by any name but the machine it is running on — so your own laptop is frictionless and everything else is not.

a configuration file names the directories this app may see, and it is deny-by-default: a new folder is invisible until somebody says otherwise. a path it refuses and a path that does not exist return the same bytes, so the error page cannot be used to ask what is there.

no third-party script, no analytics, no font from somebody else's server. the page you are reading loads nothing it did not serve.

running it on your own machine

it points at whatever folder you give it, and it is built to be run by the person whose notes those are.

what that takes: a container, that directory, and a reverse proxy in front. there is no database to migrate — the notes are the state, and the accounts table is one row.

leave an address and there will be a line when there is something to say. nothing is sent before then, and it is not sent to anybody else.