Everything it does
In detail, and with the reasoning — because most of these are decisions, not just features.
An editor over real Markdown
The text in the window is the file. Open Note decorates it in place — headings grow, bold goes bold, syntax markers fade — but it never converts your note into a document model and back again.
That matters for two reasons. A round-trip through a rich-text model quietly rewrites formatting it does not understand, and it turns every edit into a noisy diff. Here a one-word change is a one-word change in Git.
- The line you are on shows its source. Move the caret onto a heading and the
#comes back, ready to edit. Every other line reads as prose. - Autocomplete for the things you link. Type
[[for note titles ranked by recency,#for tags,:for emoji — and a title no note has yet stays typeable, so writing the link still creates the note. - The verbs a Markdown editor needs. Bulleted and numbered lists, quotes, code fences, headings one through six, move a line up or down, indent a whole list item. Insert today's date or the time in a keystroke.
- Tables you can actually edit. Add or move a row or column, change a column's alignment — and the pipes are re-padded so the source stays readable in any other editor.
- Find and replace inside the open note, and a full set of shortcuts you can rebind.

Git sync you do not have to think about
Four independent loops run per vault: write, commit, push and fetch. Each is separately configurable and separately switchable, and the current state is always on screen —synced, committing, pushing, updates available,offline, conflict.
- Writes land half a second after you stop typing.
- Commits batch up — thirty seconds idle, or five minutes elapsed — so your history is readable instead of one commit per keystroke.
- Pushes follow a commit, and back off when the network is out. Never forced.
- Fetches run on a timer while the window is focused. A clean worktree fast-forwards silently and the open note reloads underneath you.
It runs your own git rather than an embedded library, so SSH agents, credential helpers, GPG signing, corporate proxies and git-lfswork because they already work on your machine.

Conflicts are never resolved for you
Because a note is one file, true conflicts are rare — but rare is not never, and one silently clobbered note ends any trust in a notes app permanently.
- All automation halts. Nothing commits, pushes or pulls while a conflict stands.
- The affected notes are named and badged in the sidebar.
- You choose: keep yours, keep theirs, or open the file with Git's markers intact and merge by hand.
- A claimed resolution is verified. If Git still reports unmerged paths, the app does not believe you and stays put.
There is no auto-merge, no auto-discard and no force push. Anywhere. Ever.

Links, backlinks and tags
Write [[Another note]] and it becomes clickable. Follow a link that has no note behind it yet and the note is created — writing the link is how you say it should exist.
- Backlinks for the open note, plus unlinked mentions — the notes that name this one without linking to it, each a click away from becoming a real link. That is the link you forgot to make.
- Renaming rewrites links. Rename a note and every
[[wikilink]]pointing at it is updated in the same commit, so the change can be reviewed and reverted as one thing. - Tags are
#plain-text, nested with slashes, shown as a collapsible tree. Rename or delete a tag across the whole vault in one named commit; give one an emoji icon; pin the ones you live in. - Drag a note into a folder and its links follow it. A move is a rename with a different destination.

Todos that are still Markdown
A task is a GFM checkbox. Nothing else is required, and nothing else is stored — so the same note renders as a working task list on GitHub.
- [ ] Write the docs @sam prio:high due:2026-09-14- Click the checkbox in the editor to tick it; one character changes on disk.
- One list for the whole vault. Every open task from every note, with the note it came from — click through and land on the exact line.
- Optional extras in plain text:
@person,prio:high, anddue:2026-09-14. Overdue and due-today are called out. - Tidy a list: mark every task done or undone, or move the finished ones to the bottom — optionally the moment you tick one.

Diagrams and drawings
A fenced mermaid block renders inline as soon as your caret leaves it, and goes back to being editable source the moment you return. Maths and callouts, below, follow exactly the same rule.
- Mermaid renders on GitHub too, so a diagram in your vault is a diagram in your repo's web view.
- Graphviz DOT for graphs that Mermaid does not cover.
- Excalidraw for freehand drawings, stored as plain JSON so they diff and merge like anything else — and
![[sketch.excalidraw]]renders the drawing right in the note, opening the canvas on click. - Rendered SVG is sanitised — scripts, event handlers and
javascript:URLs are stripped before anything reaches the screen. A vault can be cloned from anywhere.

History, branches and pull requests
The whole point of a Git backend is that the history is real. Open Note surfaces it without asking you to open a terminal.
- Every version of a note, with the diff, and a one-click restore to any of them.
- Discard changes back to the last commit when an edit goes wrong.
- Branches — create, switch, merge and delete. Draft a reorganisation on a branch and merge it when it works.
- Open a pull request on GitHub, GitLab or Bitbucket for the current branch, in your real browser where you are already signed in.

A note list, and finding your way around
The tree is only one way in. A list pane sits between it and the editor — title, an excerpt, the date, an attachment badge — and it is where the app reads as a notes app rather than a file browser.
- Sort by modified, title, or created date — created coming from the first commit that added the file, the one definition that survives a clone.
- Collections: everything, Today, Untagged, the Archive, or any tag.
- Back and forward across the notes you have opened, restoring where you were — a history above the editor, kept separate from undo.
- Quick switcher, command palette and full-text search share one overlay; a fourth mode jumps straight to a tag. Layout shortcuts show or hide the tree and the list.

The rest of the repository
A vault is an ordinary Git repo, so it holds more than notes — and the app stops pretending otherwise.
- Text files open properly. A
.txt, aconfig.json, a shell script — all editable, with line numbers and syntax highlighting for around 150 languages. - Attach any file by dropping it in or picking it — images inline, a PDF previews in the native viewer, everything else becomes a chip that opens in its OS handler. Reveal in Finder and open in the default appare a right-click away.
- Read-only notes.
readOnly: truein a note's frontmatter locks the editor — and travels with the file, the way app-local state would not. - Multiple vaults open at once, each with its own sync state, settings and branch. Start a new one from a folder of Markdown you already have.

Markdown, more of it
The ones that earn their place render when someone opens the vault on github.com.
- Callouts — GitHub's
> [!NOTE],[!TIP],[!WARNING]and the rest, drawn with a coloured rule, an icon and a label. - Maths —
$inline$and$$block$$through KaTeX, which loads on first use rather than at startup so a vault of prose never pays for it. - Footnotes —
[^1]concealed to a superscript, the definition on hover, and a command to renumber them into document order. - Highlight (
==text==) and underline(<u>text</u>) — the underline chosen because it renders everywhere, where~text~would collide with strikethrough. - Heading folding — fold a section down to its heading; a reading posture, never written into the file.
Getting notes in and out
One converter underneath, Markdown to HTML and back, feeding paste, copy, print and export.
- Paste a web page as Markdown — clean headings and lists instead of a wall of HTML — with explicit "paste as plain text", "as raw HTML" and "as a code block" when you want them. A URL dropped onto a selection wraps it as a link.
- Copy As plain text, Markdown, HTML, or rich text for an email or a chat — optionally with the
#tagsstripped out. - Print, and print to PDF, through the system dialog against the same HTML the export produces.
- Export a note as self-contained HTML with images inlined and wikilinks rewritten to real links, as a Word document, or as aTextbundle that carries its attachments. Export a whole folder at once, or merge several notes into one.
Make it look right
It is a tool for writing prose, so how the prose looks is a setting, not a fixed opinion.
- Typography — the text, heading and code fonts, size, line height, line width, paragraph spacing and indent. Applied as CSS variables, so nothing rebuilds and the text simply reflows.
- Themes are JSON in
.opennote/themes/, so they sync, version and can be shared like a note. A handful ship built in, in the same format. - Zoom the whole editor, and choose whether to conceal Markdown syntax everywhere or only off the line you are editing.
- Spell check is off by default, deliberately: the OS checker is coupled to the smart-quote and dash substitution that turns
"key"into curly quotes inside a code fence or a YAML block, which quietly corrupts the file.
A note's life
- One info panel with three tabs: statistics — words, paragraphs, reading time, and the created and modified dates — the outline, and the backlinks.
- Templates. A
templates/folder, a "new from template" command, and{{title}}/{{date}}/{{time}}filled in. Daily notes use the same mechanism. - Archive is a folder, not a hidden flag — moving a note there is visible in the tree, on github.com and in the commit. Archived notes drop out of the default list and search while staying indexed and linkable.
Reach it from outside
A URL scheme and a CLI, so a script — or a browser, or a shortcut — can drive it.
- An
opennote://URL scheme — open a note, create one, append to one, run a search, jump to a tag. Nothing destructive is reachable by URL: append only adds, and new refuses to overwrite. - Global hotkeys to show the window or start a new note, unbound by default and set in the same keymap panel as everything else.
- A command-line tool —
opennote new,append,search,open, reading from stdin where it helps. It works on all three desktops and composes with everything a shell can do.
Where things are kept
Per-vault settings, your keymap and any themes live in .opennote/ inside the repository, so they travel with the vault between machines. All of it is hand-editable JSON, and a broken field falls back to its default rather than taking the app down with it.
Machine-local state — which vaults you have opened recently, and the zoom level — stays in your OS config directory and is never committed.
Try it against a repository you already have.
Nothing to sign up for, and nothing to migrate.