Thanks for your interest in improving ZenNotes — a keyboard-first, Markdown-first desktop notes app built on Electron, React, TypeScript, and CodeMirror 6.
- For anything non-trivial, open an issue first so we can agree on scope and approach before you spend time building.
- For small fixes (typos, obvious bugs, dependency bumps), open a PR directly.
- For security issues, do not open a public issue — follow SECURITY.md.
git clone https://github.com/ZenNotes/zennotes.git
cd zennotes
npm install
npm run devUseful scripts:
npm run dev— run the desktop app with hot reload (dev:web,dev:server, anddev:web-stackcover the web client and Go server)npm run typecheck— TypeScript across every workspacenpm run test:run— the full test suite, non-interactive (npm testis the watch variant)npm run build— production build of the web client, desktop app, and Go servercd apps/server && go test ./...— the Go server's own tests
There is no lint step; match the style of the surrounding code (Prettier is available if a file you touched is already formatted with it).
- Fork the repo and create a feature branch from
main. - Keep commits focused. A clear commit message beats a long PR description.
- Add or update tests when you change behavior.
- Make sure
npm run typecheck,npm run test:run, andnpm run buildpass locally. - Open a pull request against
main.
Branch protection on main enforces:
- Pull request required — no direct pushes
- One approving review from a code owner (see .github/CODEOWNERS)
- Green CI across Linux, macOS, and Windows build jobs
- Linear history (squash merge only; the head branch is auto-deleted)
- All review comments resolved before merging
- Match the style of the surrounding code — don't introduce new patterns mid-file.
- Keep the scope of each PR tight. Refactors, feature work, and formatting changes belong in separate PRs.
- ZenNotes is keyboard-first. Every new user-facing feature should ship with a keybinding or leader flow.
Be kind, assume good faith, focus on the work.
By contributing, you agree that your contributions are licensed under the MIT License.