✨ Become an AI-era PM — words → product → doAIPM.com
SoloMD

Sync, History & Backup

Your notes are plain files in a folder — these features keep that folder safe and everywhere.

Git history (local snapshots)

GitHub sync — setup

  1. Create a Personal Access Token at github.com → Settings → Developer settings → Personal access tokens. Two kinds work:
    • Fine-grained (recommended): select the sync repository (or “All repositories”), and under Repository permissions set Contents: Read and write. Mind the expiration date you pick.
    • Classic: check the repo scope.
  2. In SoloMD: Settings → Sync → paste the token. SoloMD verifies it and shows your GitHub user.
  3. Link a repository — pick an existing one, or let SoloMD create a private vault repo for you.
  4. Push / pull from the toolbar pill or the command palette; optional auto-push / auto-pull run in the background.

End-to-end encryption (optional)

Enable E2EE with a passphrase and SoloMD pushes an encrypted shadow copy instead of plaintext — GitHub stores ciphertext only. The passphrase never leaves your machine; without it the remote cannot be decrypted (there is no recovery). Share links are disabled for encrypted workspaces by design.

Share links

“Copy Share Link for This Note” produces a URL that renders the note via the repo — handy for sending a single note to someone without giving repo access.

Troubleshooting

ErrorCause and fix
401 / Bad credentials GitHub rejected the token itself. Checklist: ① token expired — fine-grained PATs default to 30–90 days, check github.com → Settings → Developer settings; ② you pasted an account password or OAuth code instead of a PAT; ③ the token was regenerated or revoked (old value stops working immediately, and GitHub auto-revokes tokens found in public code); ④ a corporate/VPN proxy strips the Authorization header. Create a fresh token and paste it again — SoloMD trims stray spaces automatically.
403 / 404 on a private repo The token is valid but lacks access: fine-grained PAT missing Contents: Read and write or not granted to that repository; classic PAT missing the repo scope; or an organization repo behind SAML SSO where the token hasn't been authorized for the org.
“Remote has newer commits” Someone (or another device) pushed first. Pull, resolve if asked, then push again.
“Protected branch” The target branch has protection rules — push to a different branch or relax the rule for your vault repo.

Syncing without GitHub

Because notes are plain files, any folder-sync tool works: iCloud Drive, Dropbox, Syncthing, OneDrive — point SoloMD at the synced folder on each device. On Android, open the same folder via the system file picker; on iOS, use a Files-app location.

Frequently asked questions

Why do I get a 401 error when connecting GitHub?

401 means GitHub rejected the token itself. In order of likelihood: the token expired (fine-grained tokens default to 30–90 days); you pasted your GitHub account password instead of a Personal Access Token (password auth was removed by GitHub in 2021); the token was revoked (regenerating a token invalidates the old one, and GitHub auto-revokes tokens it finds in leaked code); or a proxy on your network strips the Authorization header. Fix: create a fresh token (see the checklist above), paste it again in Settings → Sync, and retry.

Is my token stored safely?

The token is stored in the operating system keychain (macOS Keychain, Windows Credential Manager, libsecret on Linux) — never in a plain-text config file, and it never leaves your machine except in requests to github.com.

What does end-to-end encryption actually encrypt?

With E2EE enabled, SoloMD pushes an encrypted shadow copy of your workspace: file contents are encrypted with a key derived from your passphrase before anything leaves your machine. GitHub only ever stores ciphertext. Losing the passphrase means the remote copy cannot be decrypted — keep it safe.

Comments & feedback

Comments live on GitHub Discussions — sign in once with your GitHub account.

Comments load from GitHub Discussions. If you see this message instead, the maintainer has not finished the one-time giscus.app setup yet — see web/COMMUNITY-SETUP.md.

Open on GitHub Discussions →