Cal.diy
★ 49.0kA 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 yetNew this week
Read recap →Weekly Recap — Oct 2, 2026 – Oct 9, 2026Oct 9, 2026
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.
Tags
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
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
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
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
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
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
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
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
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
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
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
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
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

