Skip to main content
The App Store CLI provides tools for creating, editing, and managing Cal.com apps.

Installation

The CLI is included in the Cal.com monorepo:
cd packages/app-store-cli
yarn install

Commands

create

Create a new app in the app store.
yarn cli create

Interactive Mode

Run without flags to use the interactive wizard:
yarn cli create
You’ll be prompted for:
  • App name
  • Description
  • Category
  • Publisher name
  • Publisher email
  • Template selection

Non-Interactive Mode

Provide all options as flags for automation:
yarn cli create \
  --name "App Name" \
  --description "Short description" \
  --category <category> \
  --publisher "Your Name" \
  --email "[email protected]" \
  --template <template>

Options

--name
string
required
App display name. The slug is automatically generated from this.
--description
string
required
Short description (recommended max 10 words). Longer descriptions go in DESCRIPTION.md.
--category
string
required
App category. Options:
  • analytics - Analytics and tracking
  • automation - AI & Automation
  • calendar - Calendar integrations
  • conferencing - Video conferencing
  • crm - CRM integrations
  • messaging - Messaging services
  • payment - Payment processing
  • other - Other apps
--publisher
string
default:"Your Name"
Publisher name or company
--email
string
Publisher contact email
--template
string
required
Template to use. Options:
  • basic - Minimal installable app
  • event-type-app-card - Event type configuration card
  • booking-pages-tag - Booking page tags/scripts
  • event-type-location-video-static - Static video location
  • general-app-settings - App settings interface
  • link-as-an-app - External link redirect
Required when using link-as-an-app template. The external URL to redirect to.

Example

yarn cli create \
  --name "Acme CRM" \
  --description "Sync bookings with Acme CRM" \
  --category crm \
  --publisher "Acme Corp" \
  --email "[email protected]" \
  --template basic
Output:
App created successfully!
Slug: acme-crm
App URL: http://localhost:3000/apps/acme-crm
Name: Acme CRM
Description: Sync bookings with Acme CRM
Category: crm

Next Step: Enable the app from http://localhost:3000/settings/admin/apps as an admin user.

create-template

Create a new app template (for Cal.com core developers).
yarn cli create-template
Templates are stored in packages/app-store/templates/ and used as scaffolds for new apps.
Most developers should use create, not create-template. Templates are for creating reusable scaffolds.

edit

Edit an existing app’s configuration.
yarn cli edit --slug <app-slug>

Options

--slug
string
required
The slug of the app to edit (matches the directory name)

Example

yarn cli edit --slug acme-crm
The interactive wizard will pre-fill existing values and allow you to modify:
  • App name
  • Description
  • Category
  • Publisher
  • Email
  • Template
Changing the slug will rename the app directory. Ensure no other processes are accessing the app files.

edit-template

Edit an existing template.
yarn cli edit-template --slug <template-slug>

delete

Delete an app from the app store.
yarn cli delete --slug <app-slug>
This permanently deletes the app directory and all its contents. This action cannot be undone.

Options

--slug
string
required
The slug of the app to delete

Example

yarn cli delete --slug acme-crm

delete-template

Delete a template.
yarn cli delete-template --slug <template-slug>

Build Commands

The CLI includes build commands for generating app registry files.

build

Generate app registry files once:
yarn build
This generates:
  • apps.metadata.generated.ts
  • apps.schemas.generated.ts
  • apps.server.generated.ts
  • apps.browser.generated.tsx
  • calendar.services.generated.ts
  • crm.apps.generated.ts
  • payment.services.generated.ts
  • video.adapters.generated.ts
  • analytics.services.generated.ts
  • redirect-apps.generated.ts

watch

Watch for changes and regenerate files automatically:
yarn watch
Useful during development. The CLI watches for:
  • New app directories
  • Changes to config.json files
  • Deleted app directories
Run yarn watch in a separate terminal during development to automatically regenerate registry files.

Package.json Scripts

The CLI package defines these scripts:
{
  "scripts": {
    "build": "ts-node --transpile-only src/build.ts",
    "cli": "ts-node --transpile-only src/cli.tsx",
    "watch": "ts-node --transpile-only src/build.ts --watch",
    "generate": "ts-node --transpile-only src/build.ts",
    "post-install": "yarn build"
  }
}
  • yarn build - Generate registry files
  • yarn cli <command> - Run CLI commands
  • yarn watch - Watch mode
  • yarn generate - Alias for build

Slug Generation

The CLI automatically generates slugs from app names:
  • Converts to lowercase
  • Replaces non-alphanumeric characters with hyphens
  • Example: “My Custom App” → “my-custom-app”
The slug is used as:
  • Directory name in packages/app-store/
  • App URL path: /apps/<slug>
  • Package name: @calcom/<slug>
  • App identifier in the database

File Generation

The build process scans all app directories and generates registry files that:
  1. Import app metadata from config.json or _metadata.ts
  2. Export app schemas from zod.ts
  3. Register API handlers from api/index.ts
  4. Map UI components from components/
  5. Register services from lib/ (Calendar, CRM, Payment, Video, Analytics)

Generation Process

// For each app directory:
app-store/
├── my-app/
│   ├── config.jsonapps.metadata.generated.ts
│   ├── zod.tsapps.schemas.generated.ts
│   ├── api/index.tsapps.server.generated.ts
│   ├── components/apps.browser.generated.tsx
│   └── lib/
│       ├── CalendarService.tscalendar.services.generated.ts
│       ├── CrmService.tscrm.apps.generated.ts
│       ├── PaymentService.tspayment.services.generated.ts
│       └── VideoApiAdapter.tsvideo.adapters.generated.ts

E2E Mode

In E2E test mode (NEXT_PUBLIC_IS_E2E=1), calendar, video, and analytics services are disabled:
export const CalendarServiceMap = process.env.NEXT_PUBLIC_IS_E2E === '1' ? {} : {
  // ... calendar services
};

Validation

The CLI validates:
  • Category must be one of the valid categories
  • Template must exist in packages/app-store/templates/
  • External link URL required for link-as-an-app template
  • Config.json must be valid JSON and match AppMetaSchema

Templates

Templates are located in packages/app-store/templates/:
templates/
├── basic/
├── event-type-app-card/
├── booking-pages-tag/
├── event-type-location-video-static/
├── general-app-settings/
└── link-as-an-app/
Each template includes:
  • config.json - Template metadata
  • package.json - Dependencies
  • index.ts - Exports
  • zod.ts - Schemas
  • api/ - API handlers
  • components/ - UI components (if applicable)
  • static/icon.svg - Placeholder icon

Cross-Platform Support

The CLI supports Windows, macOS, and Linux:
  • Windows: Uses xcopy, move, mkdir, rd commands
  • Unix: Uses cp, mv, mkdir, rm commands
Platform detection is automatic based on os.platform().

Troubleshooting

Command Not Found

Ensure you’re in the correct directory:
cd packages/app-store-cli
yarn cli create

Invalid Template

List available templates:
ls packages/app-store/templates/

Invalid Category

Valid categories:
  • analytics
  • automation
  • calendar
  • conferencing
  • crm
  • messaging
  • payment
  • other

App Not Appearing

After creating an app:
  1. Run yarn build to regenerate registry files
  2. Restart the dev server
  3. Enable the app in /settings/admin/apps

Directory Already Exists

The CLI won’t overwrite existing apps. Use edit to modify an existing app or delete to remove it first.

Advanced Usage

CI/CD Integration

Use non-interactive mode in CI pipelines:
yarn cli create \
  --name "$APP_NAME" \
  --description "$APP_DESCRIPTION" \
  --category "$APP_CATEGORY" \
  --publisher "$PUBLISHER_NAME" \
  --email "$PUBLISHER_EMAIL" \
  --template "$TEMPLATE_NAME"

Scripting

Create multiple apps with a script:
#!/bin/bash

apps=(
  "App One:Description 1:crm"
  "App Two:Description 2:payment"
)

for app in "${apps[@]}"; do
  IFS=':' read -r name desc category <<< "$app"
  yarn cli create \
    --name "$name" \
    --description "$desc" \
    --category "$category" \
    --template basic
done

Custom Templates

Create your own templates:
  1. Use yarn cli create-template to create a template
  2. Customize the scaffold files
  3. Use it with --template your-template-name

Next Steps

Build an App

Complete guide to building your first app

App Types

Learn about different app service types

Source Code

View the CLI source code

Build docs developers (and LLMs) love