Open-Source Wikis

/

Cal.com

/

How to contribute

/

Tooling

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-proxy

When 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-off

Husky'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 in packages/app-store/*.
  • Swagger / OpenAPIapps/api/v2 emits apps/api/docs/v2/openapi.json via 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 through packages/lib/triggerDevLogger.ts.
  • Tasker — an in-process queue at packages/features/tasker for short-lived deferred work backed by a Postgres table.
  • GitHub Actions cron workflows — every cron-*.yml under .github/workflows/ runs on a schedule (booking reminders, SMS reminders, monthly digest emails, syncing app metadata, scheduled cleanup, etc.).

Observability

  • Sentryapps/web/sentry.*.config.ts and apps/api/v2/src/instrument.ts. Errors are tagged with ErrorCode when applicable.
  • Checkly — synthetic monitoring against staging. Config: checkly.config.ts. Tests live in __checks__/.

Email + SMS

  • SendGrid + SMTP wrappers live in packages/lib/Sendgrid.ts and the email templates in packages/emails/.
  • Twilio SMS lives in packages/sms/.

Secrets

  • Infisical — the i-* yarn scripts (i-dev, i-dx, i-gen-web-example-env) wrap commands with infisical run -- to inject secrets without storing them on disk.
  • .env for local development is the fallback. dotenv-checker validates .env against .env.example.

CI

  • Every PR triggers .github/workflows/all-checks.yml, which fans out into:
    • check-types.yml
    • check-prisma-migrations.yml
    • e2e.yml, e2e-app-store.yml, e2e-embed.yml, e2e-embed-react.yml, e2e-atoms.yml, e2e-api-v2.yml
    • api-v2-unit-tests.yml
    • api-v2-production-build.yml, atoms-production-build.yml
  • .github/workflows/changesets.yml runs the Changesets release flow.
  • .github/workflows/cleanup-report.yml and cleanup.yml automate 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 under apps/docs/content/, configuration in apps/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 changeset

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

Tooling – Cal.com wiki | Factory