Skip to main content

Before you start

  • Get the project running locally — follow the Server Setup and Client Setup guides.
  • Check the open issues to see if someone is already working on your idea.
  • For significant changes, open a GitHub issue first to discuss the approach before writing code.

Workflow

1

Branch from develop

Always branch from develop, never from master:
2

Make your changes

Keep commits small and focused. Run npm run lint before each commit — a pre-commit hook will catch most issues automatically.
3

Test locally

Make sure the server starts cleanly and existing behaviour is not broken. Run npm test for unit tests and npm run test:e2e for end-to-end tests.
4

Open a PR against develop

Fill in every section of the PR template — especially how to test. Incomplete PRs will be sent back.
5

Review and merge

Every PR passes through three layers before it can merge:
  1. CodeRabbit auto-reviews when the PR is opened. Resolve every thread it raises.
  2. /pr-review-merge <PR number> (run via Claude Code inside the repo) — a judgment-based review that checks gates and routes the PR with a label and reviewer request.
  3. A maintainer approves and merges in the GitHub UI (squash merge).
6

Staging → production

Once verified on staging (develop), a separate PR promotes it to master, which triggers the production deploy including migrations.

Branch naming

Examples: feat/bulk-contact-import, fix/attendance-query, chore/update-deps

Commit messages

Use Conventional Commits:
The repo is Commitizen-friendly — you can run npm run commit for an interactive prompt.

Database migrations

When your change modifies a TypeORM entity:
  1. Generate a migration: npm run migration:generate -- src/migrations/<Name>
  2. Review the generated file carefully.
  3. Test both directions: npm run migration:run then npm run migration:revert.
  4. Commit the entity change and the migration file together in the same PR.
See Database & Migrations for the full workflow.

Code style

  • ESLint and Prettier are configured on both server and client.
  • Run npm run lint and npm run format before pushing.
  • Do not disable lint rules without a clear explanation in a comment.

PR review gates

Before a PR can merge, all of the following must pass: PRs that touch sensitive paths (entity definitions, migrations, auth/tenant code, finance, deploy workflows) are routed to the Senior Engineering team for review.