Thanks for your interest in contributing! Bug reports, feature ideas and pull requests are all welcome.
- Search existing issues first.
- Use the issue templates and include your version (image tag or commit) and steps to reproduce.
- For security issues, follow SECURITY.md instead of opening a public issue.
See DEVELOPMENT.md for running the app with Docker or directly with Node.js.
app/ Nuxt frontend (components, composables, pages)
server/ Nitro backend (API routes, middleware, database, services)
shared/ Types and helpers used by both app/ and server/
scripts/ Standalone CLI scripts (e.g. OTP setup)
-
Fork the repo and create a branch from
master. -
Keep pull requests focused on one change.
-
If you change
server/database/schema.ts, generate a migration withnpm run db:generate -- --name=<migration-name>and commit it. -
Make sure these pass locally before opening the PR:
npm run lint npm run typecheck npm test npm run build -
Fill in the pull request template and describe how you tested the change.
Use a short, imperative, Title Case subject line, for example:
Add Label Reordering
Fix Upload Size Check
- TypeScript everywhere; avoid
any(the linter enforces this). - Match the style of the surrounding code. Run
npm run lint:fixto auto-fix what ESLint can. - Put types, constants and validation schemas used by both the client and the server in
shared/. - Add or update tests for behavior changes (
test/unit/for pure logic,test/e2e/for API behavior).
- Dialogs use
<UiModal>(focus trap, scroll lock, Escape) and destructive confirmations use<UiConfirmDialog>. - Close-on-Escape goes through
useEscapeKey(handler, isOpen), so only the top-most open layer reacts. - Icons come from
<UiIcon name="…">; add new ones toapp/utils/icons.tsinstead of inlining SVGs. - Icon-only buttons need an
aria-label, and inputs need a label (usesr-onlyif it shouldn't be visible). - Note data lives in
useNotesList(loading),useNoteMutationsanduseNoteAttachments(changes).
By contributing, you agree that your contributions will be licensed under the AGPL-3.0 license.