selfhostedworld.com logoselfhostedworld.com

Try describing what you need:

Cal.com logo

Cal.com

★ 48.9k

A self-hosted alternative to Calendly

GNU Affero General Public License v3.0Open Source — No Paywall5 Containers — 5 containers — moderate hosting footprintDocker · Compose · SourceNeeds Postgres0 documented maintainers

About

Cal.diy is a community-maintained, MIT-licensed scheduling platform intended for people who want to run their own instance. It is presented as the open-source community edition of Cal.com, with...

Community Ratings

No ratings yet
booking-screen

Features

  • scheduling platform
  • self-hosting
  • local Postgres setup
  • seeded test users
  • admin user
  • database migration
  • email viewing during development
  • logger level configuration

Details

Last Updated
Oct 10, 2026
Created
Mar 22, 2021
Install Methods
dockerdocker-composesource
Requirements
Node.js >=18.xPostgreSQL >=13.xYarnDockerDocker ComposeMailhog
Authentication
local
API
REST
Runtime / Stack
Nodejs
Privacy & Independence
No Cloud Required
User Model
Multi-User
Deployment

Deployment: Docker Compose ✓5 Containers — moderate hosting footprintRuns as 5 containers

Run Cal.com with Docker Compose

Compose file from the Cal.com project repository.

5 services · database: postgres · infra: postgres, redis

no resource limits declared

needs persistent storage (2 volumes)

docker-compose.yml · @ d1ad4ea · scanned Jun 4, 2026

# Use postgres/example user/password credentials

volumes:
  database-data:
  redis-data:

networks:
  stack:
    name: stack
    external: false

services:
  database:
    container_name: database
    image: postgres
    restart: always
    volumes:
      - database-data:/var/lib/postgresql
    environment:
      - POSTGRES_USER=unicorn_user
      - POSTGRES_PASSWORD=magical_password
      - POSTGRES_DB=calendso
    networks:
      - stack

  redis:
    container_name: redis
    image: redis:latest
    restart: always
    volumes:
      - redis-data:/data
    networks:
      - stack
    ports:
      - "${REDIS_PORT:-6379}:6379"

  calcom:
    image: calcom.docker.scarf.sh/calcom/cal.diy
    build:
      context: .
      dockerfile: Dockerfile
      args:
        NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL}
        NEXT_PUBLIC_API_V2_URL: ${NEXT_PUBLIC_API_V2_URL}
        NEXT_PUBLIC_LICENSE_CONSENT: ${NEXT_PUBLIC_LICENSE_CONSENT}
        NEXT_PUBLIC_WEBSITE_TERMS_URL: ${NEXT_PUBLIC_WEBSITE_TERMS_URL}
        NEXT_PUBLIC_WEBSITE_PRIVACY_POLICY_URL: ${NEXT_PUBLIC_WEBSITE_PRIVACY_POLICY_URL}
        NEXT_PUBLIC_SINGLE_ORG_SLUG: ${NEXT_PUBLIC_SINGLE_ORG_SLUG}
        ORGANIZATIONS_ENABLED: ${ORGANIZATIONS_ENABLED}
        CALCOM_TELEMETRY_DISABLED: ${CALCOM_TELEMETRY_DISABLED}
        NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
        CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY}
        DATABASE_URL: ${DATABASE_URL}
        DATABASE_DIRECT_URL: ${DATABASE_URL}
        CSP_POLICY: ${CSP_POLICY}
    restart: always
    networks:
      - stack
    ports:
      - 3000:3000
    env_file: .env
    environment:
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
      - DATABASE_DIRECT_URL=${DATABASE_URL}
    depends_on:
      - database

  calcom-api:
    container_name: calcom-api
    build:
      context: .
      dockerfile: apps/api/v2/Dockerfile
      args:
        DATABASE_URL: ${DATABASE_URL}
        DATABASE_DIRECT_URL: ${DATABASE_URL}
    restart: always
    networks:
      - stack
    ports:
      - "${API_PORT:-80}:${API_PORT:-80}"
    env_file: .env
    environment:
      - NODE_ENV=${NODE_ENV}
      - API_PORT=${API_PORT:-80}
      - API_URL=${API_URL}
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
      - DATABASE_READ_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
      - DATABASE_WRITE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
      - DATABASE_DIRECT_URL=${DATABASE_URL}
      - NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
      - JWT_SECRET=${JWT_SECRET}
      - REDIS_URL=${REDIS_URL}
      - LOG_LEVEL=${LOG_LEVEL}
      - API_KEY_PREFIX=${API_KEY_PREFIX}
      - WEB_APP_URL=${WEB_APP_URL}
      - IS_E2E=${IS_E2E:-false}
      - REWRITE_API_V2_PREFIX=${REWRITE_API_V2_PREFIX:-true}
      - CALCOM_LICENSE_KEY=${CALCOM_LICENSE_KEY}
      - NEXT_PUBLIC_VAPID_PUBLIC_KEY=${NEXT_PUBLIC_VAPID_PUBLIC_KEY}
      - VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - STRIPE_API_KEY=${STRIPE_API_KEY}
      - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
      - STRIPE_PRICE_ID_STARTER=${STRIPE_PRICE_ID_STARTER}
      - STRIPE_PRICE_ID_STARTER_OVERAGE=${STRIPE_PRICE_ID_STARTER_OVERAGE}
      - STRIPE_PRICE_ID_ESSENTIALS=${STRIPE_PRICE_ID_ESSENTIALS}
      - STRIPE_PRICE_ID_ESSENTIALS_OVERAGE=${STRIPE_PRICE_ID_ESSENTIALS_OVERAGE}
      - STRIPE_PRICE_ID_ENTERPRISE=${STRIPE_PRICE_ID_ENTERPRISE}
      - STRIPE_PRICE_ID_ENTERPRISE_OVERAGE=${STRIPE_PRICE_ID_ENTERPRISE_OVERAGE}
      - STRIPE_TEAM_MONTHLY_PRICE_ID=${STRIPE_TEAM_MONTHLY_PRICE_ID}
      - IS_TEAM_BILLING_ENABLED=${IS_TEAM_BILLING_ENABLED:-false}
      - AXIOM_DATASET=${AXIOM_DATASET}
      - AXIOM_TOKEN=${AXIOM_TOKEN}
      - LOGGER_BRIDGE_LOG_LEVEL=${LOGGER_BRIDGE_LOG_LEVEL}
      - DOCS_URL=${DOCS_URL}
      - GET_LICENSE_KEY_URL=${GET_LICENSE_KEY_URL}
    depends_on:
      - database
      - redis

  # Optional use of Prisma Studio. In production, comment out or remove the section below to prevent unwanted access to your database.
  studio:
    image: calcom.docker.scarf.sh/calcom/cal.diy
    restart: always
    networks:
      - stack
    ports:
      - 5555:5555
    env_file: .env
    environment:
      - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
      - DATABASE_DIRECT_URL=${DATABASE_URL}
    depends_on:
      - database
    command:
      - npx
      - prisma
      - studio
# END SECTION: Optional use of Prisma Studio.

This file may be out of date. Check the Cal.com website for current setup steps.

Open-source health

FOSS with issues

agplv3-mixedopen-corecopyleft-clapoisoned-sourcevc-fundingmisleading-licensing

Source: isitreallyfoss.com · reviewed Jun 2025

Track your self-hosted stack

Bookmark software to try, rate tools you've used, and keep your collection in one place.

Metadata extracted from README on May 27, 2026

Related Software

Cal.diy logo

Cal.diy

48.9k
Cal.diy is a community-driven, open-source scheduling platform for self-hosting personal scheduling infrastructure.
Calendar and ContactsSelf Hosting SolutionsScheduling and Bookings
5 Containers
Details
Easy!Appointments logo

Easy!Appointments

4.4k
Easy!Appointments is a self-hosted appointment scheduler for booking customers with businesses through a web interface.
Scheduling and BookingsCopyleft LicenseSelf Hosting Solutions+2
Details
Manage My Damn Life logo

Manage My Damn Life

643
Manage my Damn Life (MMDL) is a self-hosted frontend for managing CalDAV tasks and calendars.
Calendar and ContactsCopyleft LicenseTask Management+2
Details
calrs logo

calrs

314
calrs is a self-hostable scheduling platform for booking meetings from public links while syncing availability with CalDAV calendars.
Scheduling and BookingsCalendar and ContactsSelf Hosting Solutions
Single Container
Details
EventSchedule logo

EventSchedule

86
An open-source platform for publishing calendars, taking registrations, selling tickets, and managing event communities.
Polls and EventsScheduling and BookingsCalendar and Contacts+3
Fully FOSS
Details
OpenEMR logo

OpenEMR

5.5k
OpenEMR is a free and open source electronic health records and medical practice management application.
Health & FitnessScheduling and BookingsSelf Hosting Solutions+2
Details
Rallly logo

Rallly

5.3k
Rallly is a self-hostable meeting poll app for scheduling group meetings by collecting participants' availability.
Scheduling and BookingsPolls and EventsCopyleft License+2
Details
Youtarr logo

Youtarr

1.7k
A self-hosted YouTube downloader that auto-downloads videos from subscribed channels and playlists, then organizes and syncs them with media servers like Plex, Jellyfin, and Emby.
Media ManagementMedia ServersAutomation Tools+2
2 Containers
Details
openGym logo

openGym

9.3k
A self-hosted gym and body-weight tracker for planning workouts, logging sets and body weight, and syncing across devices with passkey login.
Health & FitnessSelf Hosting SolutionsAuthentication Services+1
3 Containers
Details
Shelf logo

Shelf

3.0k
Shelf is an open-source platform for tracking physical assets, bookings, custody, locations, and inventory across teams and organizations.
Inventory ManagementMaps and GPSCopyleft License+4
2 Containers
Details
eLabFTW logo

eLabFTW

1.4k
eLabFTW is a browser-based electronic lab notebook and research team manager with built-in database and API support.
CMS PlatformsCopyleft LicenseSelf Hosting Solutions+4
Details
Cronicle logo

Cronicle

5.9k
A multi-server task scheduler and runner with a web-based UI for scheduled, repeating, and on-demand jobs.
Automation ToolsTask RunnersScheduling and Bookings+2
Details