CleanShot.2026-02-24.at.19.09.25.mp4
Minimal Notion-style Markdown editor for GitHub repositories.
- TanStack Start
- shadcn/ui
- Pages CMS editor (
editor.pagescms.org) - Better Auth (GitHub OAuth)
- GitHub App (installation + repo access model)
Each page is one Markdown file with:
title: first# H1in document body (required)body: remaining Markdown contenticon: optional frontmattercover: optional frontmatter
Hierarchy is folder-based only:
setup.mdis parentsetup/step-1.mdis a child
Deleting a parent page cascades to all its children.
PullNotes uses a hybrid model:
- GitHub App installation controls which repos are accessible.
- GitHub OAuth user token performs write/delete operations.
This keeps repo access scoped by App install, while commits are attributed to the signed-in user.
- Install deps:
pnpm install- Run setup wizard:
pnpm setupThis creates/configures a GitHub App from a manifest and writes .env.
- Start dev:
pnpm devpnpm dev runs auth migrations automatically before starting.
BETTER_AUTH_SECRETBETTER_AUTH_URLAUTH_DB_PROVIDER(sqliteord1)DB_PATH(for sqlite)DB_D1_BINDING(for d1 runtime binding name)GITHUB_APP_IDGITHUB_APP_NAMEGITHUB_APP_PRIVATE_KEYGITHUB_APP_CLIENT_IDGITHUB_APP_CLIENT_SECRETPEXELS_API_KEY(cover image search)
Callbacks:
- OAuth callback URL:
https://<your-domain>/api/auth/callback/github - Setup URL:
https://<your-domain>/api/github-app/callback - Redirect on update: enabled
Permissions:
- Repository:
Contents= Read & write - Repository:
Metadata= Read-only - Account:
Email addresses= Read-only
Without Email addresses: Read-only, some users can hit ?error=email_not_found.
- Home selector:
/ - Repo editor:
/:owner/:repo/:branch - Optional query params:
file: selected file pathroot: optional subfolder root
- Save state icons:
- clean: check
- dirty: save
- saving: loader
- Keyboard save:
Cmd+S/Ctrl+S - Sidebar shortcut
Cmd/Ctrl+Bis disabled - Top content header is hidden when repo has no files
- Empty repos use shadcn
Emptystate - Cover picker uses Pexels API
- Icon picker supports emoji search
- Build:
pnpm build(ornpm run build) - Start:
npm start - Server must run on port
8000in hosted environments
If using sqlite in production, ensure persistent disk. For serverless/ephemeral environments, prefer AUTH_DB_PROVIDER=d1.