selfhostedworld.com logoselfhostedworld.com

Try describing what you need:

Cal.diy logo

Cal.diy

★ 49.0k

A self-hosted alternative to Calendly, Doodle

MIT LicenseOpen Source — No Paywall5 Containers — 5 containers — moderate hosting footprintSource · Docker · ComposeNeeds Postgres0 documented maintainers

About

Cal.diy is the community edition of Cal.com, presented as a fully open-source scheduling platform intended for people who want to run their own scheduling stack. The README emphasizes that it is...

Community Ratings

No ratings yet
booking-screenimage

Features

  • self-hosted scheduling
  • open-source community edition
  • local development setup
  • seeded test users
  • database migrations
  • logger level configuration
  • Gitpod workspace
  • Prisma database studio

Details

Last Updated
Oct 14, 2026
Created
Mar 22, 2021
Install Methods
sourcedockerdocker-compose
Requirements
Node.js >=18.xPostgreSQL >=13.xYarnDockerDocker Compose
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.diy with Docker Compose

Compose file from the Cal.diy project repository.

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

no resource limits declared

needs persistent storage (2 volumes)

docker-compose.yml · @ f004349 · scanned Jun 9, 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.diy website for current setup steps.

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 Jul 24, 2026

Related Software

Cal.com logo

Cal.com

49.0k
Cal.diy is a self-hosted, open-source scheduling platform forked from Cal.com with enterprise features removed.
Scheduling and BookingsCopyleft LicenseCalendar and Contacts+3
5 ContainersFOSS with Issues
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

642
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

318
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

88
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
openGym logo

openGym

11.1k
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
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
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