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.
  • Wikilink brackets disappear while reading and return while editing.[[note|label]] shows just the label.
  • Find and replace inside the open note.
  • Paste an image and it is written into the vault as a real file and linked relatively — not embedded as base64.
A note open in the editor with concealed Markdown syntax, a wikilink and a task list.

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.

The sync settings panel, showing toggles and intervals for the commit, push and fetch loops.

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.

The conflict screen listing a conflicted note with keep-mine, keep-theirs and manual merge options.

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, with the sentence each link sits in.
  • 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 in the note body, with a browser listing every tag and what carries it.
  • Drag a note into a folder and its links follow it. A move is a rename with a different destination.
The tag browser open beside a note, listing every tag in the vault with how many notes carry it.

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 !high ~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,!high, and ~2026-09-14 for a due date. Overdue and due-today are called out.
  • Filter by open, done or all.
The task view with open tasks listed, each showing its source note.

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.

  • 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.
  • Rendered SVG is sanitised — scripts, event handlers andjavascript: URLs are stripped before anything reaches the screen. A vault can be cloned from anywhere.
A Mermaid flowchart rendered inline beneath its source block in a note.

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.
The history panel listing commits that touched the open note, with a diff.

Finding things

  • Full-text search across every note, with the matching line as the preview.
  • Quick switcher that fuzzy-matches titles and opens on Enter — and offers to create the note when nothing matches.
  • Command palette listing every command with its current shortcut.
  • Sidebar filter, pinned notes, and an outline of the open note's headings.
  • Today's note on a shortcut, from a template, filed by date.
The command palette open over a note, listing commands with their keyboard shortcuts.

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.
  • Images get a preview. Binaries are listed but never opened.
  • Multiple vaults open at once, each with its own sync state, settings and branch.
  • Export a note as a self-contained HTML page, images inlined.
  • Every shortcut is rebindable, with an alternative preset. The keymap lives in the vault, so it travels between machines.
A TypeScript file open in the plain text editor with line numbers and syntax highlighting.

Where things are kept

Per-vault settings and your keymap live in .opennote/ inside the repository, so they travel with the vault between machines. Both are 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 — 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.