Back to portfolio
Case study · open source · creator & maintainer

ForkLeaf

Notes that outlive the app that made them.

A full Markdown workspace whose database is a GitHub repository you already own. Wikilinks and backlinks, offline full-text search, a visual Mermaid diagram studio, PDF reading with sentence-level citations, branches and pull requests, publishing to GitHub Pages and a built-in MCP server so Claude can read and write your notes as ordinary commits. Nothing is stored on ForkLeaf's servers — there is no database to be locked out of.

0
Servers holding notes
6
Export formats
14
Diagram templates
Apache-2.0
Licensed
View repositoryLive appTry without an accountDocs

Every notes app asks you to trust it with your writing

Notes are the one kind of file you expect to outlive the software that made them, and they are the kind most often held hostage. Your history lives in someone's proprietary revision table, your export is a lossy afterthought, and the free tier ends at the storage limit.

The lock-in isn't malice, it's architecture. Once an app owns the database, leaving means writing a migration — so most people don't, and the notes stay wherever they were first typed.

Don't hold the notes at all

ForkLeaf has no note storage. On first sign-in it asks which GitHub repository to use — one you already have, optionally scoped to a subfolder, or a new one it creates only when you ask. Every note is a plain .md file committed there.

That one decision answers several questions at once. Version history is git history. Sync is a push. Backup is a clone. Sharing is a commit to docs/ served by GitHub Pages. And the app is free with no tiers, because the expensive part of a notes app is storage and this one has none.

Local-first, so the network is never in the way of typing

Edits are written to IndexedDB immediately and pushed afterwards. Changes made offline queue and drain on reconnect; closing the tab loses nothing. If a note changed both locally and on GitHub, you are asked what to keep rather than having one side silently overwritten.

Committing per keystroke would turn the repo into noise, so rapid edits to one note coalesce into a single pending change and a commit made minutes ago is amended rather than stacked. The result is a git log a human can actually read.

Four rules the app is built on

Your repo, not ours
Every note is a plain .md file in a repository you own. Clone it and you have everything — walking away costs nothing.
Git is the version history
No bespoke revision feature. Notes are ordinary commits, so history, branches and pull requests already work.
Local-first
Edits land in IndexedDB before the network sees them. Offline changes queue and drain; closing the tab loses nothing.
Free because it stores nothing
The expensive part of a notes app is storage, and ForkLeaf has none. That is why there are no tiers.

A workspace, not a text box

Everything below runs client-side against the notes already on your machine — which is why it all still works with the network off.

Writing & linking
  • Three editing modes: rich text, split source/preview, raw markdown
  • [[Wikilinks]] in the Obsidian dialect — plain text in the file
  • Backlinks that quote the line they were written on
  • Frontmatter panel, so notes stay portable to Obsidian and Hugo
Search & diagrams
  • BM25 full-text search over every note, in-browser and offline
  • Visual Mermaid builder — six diagram types drawn, not typed
  • 14 diagram templates and a source editor with plain-language errors
  • Diagrams stored as normal ```mermaid blocks, so github.com renders them
TypeScriptNext.jsTurborepoIndexedDBGitHub APIMermaidMCPVitestApache-2.0

Open it, connect a repo, start writing

Sign in with GitHub and pick the repository your notes should live in. It installs as a desktop app too, and registers itself with the operating system as a Markdown editor — so double-clicking a .md file opens it in ForkLeaf and ⌘S writes that file back where it came from, not to a copy in Downloads.

Nothing is created on your account without you asking, and unpublishing a shared note is a commit that deletes a file.

© 2025 · Praneeth.exe · All rights reserved
Designed with intention · Built in Next.js