Skip to content

Contributing

Guidelines for contributing code to TT Time Tracker.

Branch naming

Use the following prefixes:

PrefixWhen to use
feat/New features
fix/Bug fixes
chore/Maintenance, dependency updates
docs/Documentation changes
refactor/Code improvements without behaviour change

Examples: feat/invoice-export, fix/entry-approval-race, chore/update-deps

Commit messages

Write imperative, present-tense commit messages:

feat: add CSV export for time entries
fix: prevent double-submission on entry form
chore: update VitePress to 1.6.3

Before opening a PR

  1. Lint your code:

    bash
    pnpm lint:fix
  2. Type-check the frontend:

    bash
    pnpm build:client
  3. Run tests (API):

    bash
    pnpm --filter @tt/api test
  4. Verify the app works — start all three services and manually verify the feature you changed.

Pull request checklist

  • [ ] Branch name follows the convention
  • [ ] No lint errors (pnpm lint)
  • [ ] Frontend builds cleanly (pnpm build:client)
  • [ ] If you added an API endpoint: the typed SDK has been regenerated (pnpm openapi)
  • [ ] If you changed the Prisma schema: a migration has been created and committed
  • [ ] PR description explains what changed and why

Monorepo commands

CommandDescription
pnpm lintLint the entire monorepo
pnpm lint:fixAuto-fix lint errors
pnpm build:clientType-check and build the frontend
pnpm build:apiBuild the NestJS API
pnpm --filter @tt/api testRun API unit tests
pnpm db:generateRegenerate the Prisma client

TT Time Tracker — Internal Documentation