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.

Repositories you can only read are not offered. ForkLeaf has to be able to commit, and showing you a repository it cannot save to would be worse than hiding it.

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.

Nothing in the local workspace is backed up. Clearing site data deletes it. To move a local note into a repository, open it, copy the content, and paste it into a new note in the repository workspace — an automatic migration is on the list, but pretending it exists would be worse than saying so.

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.

Anyone with the link can read a published page, whether or not the repository is private. Publishing from a private repository needs a paid GitHub plan; GitHub says so if that applies to yours, and the page is committed either way, so turning Pages on later publishes it as it stands.

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

forkleaf-notes/
README.md
architecture/
  sync-engine.md
  storage.md
meetings/
  2026-08-14.md
reading-list.md

Folders 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.