calcom/cal.com
Tooling
The third-party tools that hold the monorepo together. Most contributors will only interact with a few of them, but it helps to know what each one is responsible for.
Build orchestrator — Turborepo
turbo.json declares every task pipeline (build, dev, lint, test, type-check, e2e, ...) and the input files that determine cache hits. Turbo lives in package.json as turbo: 2.7.1.
Useful commands:
yarn turbo run build --filter=@calcom/web
yarn turbo run lint --filter=@calcom/features
yarn turbo run dev --filter=@calcom/web --filter=@calcom/api-proxyWhen the cache misbehaves, --force disables it for that run.
Package manager — Yarn 4 (Berry)
packageManager: "yarn@4.12.0" and engines.yarn: ">=4.12.0" in package.json. The .yarn/ directory at the repo root contains plugins, releases, and patches (.yarn/patches/ is non-trivial: dayjs, libphonenumber-js, next-i18next).
The resolutions block in package.json pins specific transitive dependencies (security patches, performance fixes). Most engineers should never touch it.
Linter and formatter — Biome
Biome replaces Prettier and most of ESLint here. Config: biome.json (full config) and biome-staged.json (lint-staged subset).
yarn lint # turbo lint, calls biome check
yarn lint:fix
yarn format # biome format --write .
yarn biome check --write . # one-offHusky's pre-commit hook runs lint-staged (lint-staged.config.mjs), which calls Biome on staged files.
Git hooks — Husky + lint-staged
.husky/ contains the hook scripts. package.json postinstall runs husky install. lint-staged.config.mjs controls per-file linting.
Type checking — TypeScript 5.9.3
Each workspace has its own tsconfig.json extending presets in packages/tsconfig/. Run yarn type-check to type-check everything (Turbo-orchestrated).
Test runners
- Vitest 4.x for unit and component tests (
vitest.config.mts,vitest.workspace.ts). - Playwright 1.57 for end-to-end (
playwright.config.ts). - Jest inside
apps/api/v2(jest.config.ts,jest-e2e.ts) — kept because NestJS tooling is happier with Jest.
Code generation
- Prisma generates the typed client, Zod schemas, and Kysely types from
packages/prisma/schema.prisma. - App Store CLI (
packages/app-store-cli) generates registries for every integration inpackages/app-store/*. - Swagger / OpenAPI —
apps/api/v2emitsapps/api/docs/v2/openapi.jsonvia Swagger decorators in NestJS controllers; the docs site renders this.
Background jobs
- Trigger.dev — the project's job runner. Config:
packages/features/trigger.config.ts. Yarn scripts:dev:trigger,deploy:trigger:prod,deploy:trigger:staging. Trigger.dev jobs send their logs throughpackages/lib/triggerDevLogger.ts. - Tasker — an in-process queue at
packages/features/taskerfor short-lived deferred work backed by a Postgres table. - GitHub Actions cron workflows — every
cron-*.ymlunder.github/workflows/runs on a schedule (booking reminders, SMS reminders, monthly digest emails, syncing app metadata, scheduled cleanup, etc.).
Observability
- Sentry —
apps/web/sentry.*.config.tsandapps/api/v2/src/instrument.ts. Errors are tagged withErrorCodewhen applicable. - Checkly — synthetic monitoring against staging. Config:
checkly.config.ts. Tests live in__checks__/.
Email + SMS
- SendGrid + SMTP wrappers live in
packages/lib/Sendgrid.tsand the email templates inpackages/emails/. - Twilio SMS lives in
packages/sms/.
Secrets
- Infisical — the
i-*yarn scripts (i-dev,i-dx,i-gen-web-example-env) wrap commands withinfisical run --to inject secrets without storing them on disk. .envfor local development is the fallback.dotenv-checkervalidates.envagainst.env.example.
CI
- Every PR triggers
.github/workflows/all-checks.yml, which fans out into:check-types.ymlcheck-prisma-migrations.ymle2e.yml,e2e-app-store.yml,e2e-embed.yml,e2e-embed-react.yml,e2e-atoms.yml,e2e-api-v2.ymlapi-v2-unit-tests.ymlapi-v2-production-build.yml,atoms-production-build.yml
.github/workflows/changesets.ymlruns the Changesets release flow..github/workflows/cleanup-report.ymlandcleanup.ymlautomate cleanup tasks.
kodiak[bot] (config: .kodiak.toml) auto-merges PRs that pass all checks and have the right labels.
Documentation
- MintLify powers
apps/docs. Pages live underapps/docs/content/, configuration inapps/docs/app/. - The legacy
docs/directory at the repo root holds reference material that hasn't migrated.
Editor tooling
.vscode/,.cursor/,.claude/,.opencode/— IDE/agent configs checked into the repo for shared editor experience..editorconfig— universal whitespace / charset rules..gitpod.yml— one-click Gitpod environment.
Useful one-liners
yarn type-check:ci --force # full type check, no cache, plain logs
yarn db-deploy # apply Prisma migrations across packages
yarn db-seed # seed local DB
yarn delete-app # remove an app from the App Store registry
yarn embed-tests # run embed test suites
yarn changesets-add # add a release changesetBuilt by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.