Repositories & workspaces
A workspace is one repository, one branch, and optionally one subdirectory inside it. You can have as many as you like and switch between them from the sidebar.
The notes repository
Signing in does not create anything. ForkLeaf asks where your notes should live, on the dashboard: connect a repository you already have — optionally scoped to a subfolder such as docs/ — or have it create a new one for you.
If you ask it to create one, the default name is forkleaf-notes and it is private, with a README and a short welcome note. If a repository of that name already exists, it is used as-is and nothing is overwritten.
This is a normal repository. Rename it, add collaborators, make it public, add a GitHub Action that publishes it as a website — none of that breaks ForkLeaf.
Connecting your own repository
Open the workspace switcher at the top of the sidebar and choose Connect another repository…. You are shown the repositories you have write access to. Pick one and set:
Branch
Defaults to the repository’s default branch. Point ForkLeaf at docs or notes if you would rather it never touched main.
Directory
Optional. Set it to docs/ and ForkLeaf treats that folder as the root of the workspace, leaving the rest of the repository alone. This is how you edit the documentation folder of a code project without the file tree filling up with source files.
Switching workspaces
The switcher lists every connected repository plus On this device. Each workspace has its own file tree and its own sync state. Switching does not move anything between them.
The local workspace
On this device always exists, signed in or not. It stores notes in IndexedDB and pushes nothing. It is useful for scratch notes, and it is where anything you wrote before signing in stays.
Publishing a note as a page
Publish as a page in the right-hand panel renders the open note to one self-contained HTML file, commits it to docs/ in the same repository, and switches GitHub Pages on. Nothing is uploaded to ForkLeaf — the page is a file in your repository, served by GitHub, and it outlives this app entirely.
A published note is marked as such wherever you look at it afterwards. The right-hand panel gains a Published section with the address, and the dashboard lists every page the repository is serving under Published pages, each with its link and an Unpublish button. That list is read back from docs/rather than remembered here, so deleting a page on GitHub directly unpublishes it as completely as the button does.
Unpublishing deletes the file — one commit, recoverable from your git history — and leaves the note alone. GitHub Pages stays switched on, because it is a repository-wide setting you may have had before ForkLeaf ever touched it.
Branches and protection rules
ForkLeaf commits directly to the configured branch. If that branch has protection rules requiring reviews or status checks, the push is rejected by GitHub and the change stays queued with the error shown in the status bar. Point the workspace at an unprotected branch.
Opening a pull request instead of committing directly is not currently supported. It is a commonly requested feature and it is tracked in the repository’s issues.
Switching branch from the status bar moves the workspace across: open notes are closed, because their content and base revisions belong to the branch you left, and the file tree and every note are re-read from the branch you moved to. The repository is still listed once in the switcher — a branch is not a second connection to the same repository. The one exception is a branch you left with edits that never reached GitHub: that stays listed on its own, because the writing only exists on this device and closing it away would lose it.
What the repository looks like
README.md
architecture/
sync-engine.md
storage.md
meetings/
2026-08-14.md
reading-list.mdFolders in the sidebar are directories on disk. Note titles become slugified filenames. There is no index file, no manifest, and no hidden state directory — the file tree is the data model.