calcom/cal.com
Apps
Cal.diy ships three deployable apps from one monorepo. Each has a distinct runtime and audience.
| App | Path | Framework | Audience |
|---|---|---|---|
| Web | apps/web |
Next.js 13+ (App Router + Pages Router) | End users, embeds, the tRPC API |
| API v2 | apps/api/v2 |
NestJS | Public REST API, Platform SDK |
| Docs | apps/docs |
MintLify | Public documentation site |
There is also a thin apps/api/index.js (with a package.json) that historically acted as a routing entry point in front of the v1 and v2 APIs. The current proxy logic for the web app lives in apps/web/proxy.ts.
Where apps integrate with packages
graph LR
Web[apps/web] -->|business logic| Features[packages/features]
Web -->|UI primitives| UI[packages/ui]
Web -->|tRPC| TRPC[packages/trpc]
Web -->|Prisma| Prisma[packages/prisma]
Web -->|i18n| I18n[packages/i18n]
Web -->|integrations| AppStore[packages/app-store]
Web -->|emails| Emails[packages/emails]
Web -->|sms| Sms[packages/sms]
Web -->|embed JS| Embeds[packages/embeds]
Api[apps/api/v2] -->|via| PlatformLibs[packages/platform/libraries]
PlatformLibs -->|re-exports| Features
PlatformLibs -->|re-exports| TRPC
Api -->|Prisma| Prisma
Api -->|generated types| PlatformTypes[packages/platform/types]
Docs[apps/docs]The diagram captures one of the most important conventions in the repo: apps/api/v2 does not import from @calcom/features or @calcom/trpc directly. It goes through packages/platform/libraries/index.ts, which re-exports the symbols it needs. This indirection is documented in AGENTS.md and exists because apps/api/v2's tsconfig.json doesn't have path mappings for those packages.
Per-app dive-ins
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.