Builds·10 min read·May 17, 2026

Self-Host Your Own Calendly in 5 Minutes with Cal.diy

Set up cal.diy (the fully open-source Cal.com fork) locally with Docker and book your first meeting. Zero monthly fees.

Calendly charges $12/month for features you can run on your own machine for free. Cal.diy is the community fork of Cal.com with every enterprise paywall stripped out. 100% MIT-licensed. No license keys. No hosted version. You own the whole thing.

This guide gets you from zero to a working booking page inside Docker. By the end you'll have your own scheduling link, calendar sync, and your first test meeting booked.

Repo: github.com/calcom/cal.diy. 43k+ stars, MIT license, active community.

The problem nobody talks about

Cal.com is "open source" in the way that matters to investors, not developers. It uses an open-core model: the base is free, but teams, organizations, SSO, workflows, and insights all sit behind a proprietary Enterprise Edition that requires a license key. Self-hosting the official repo still phones home.

Cal.diy rips all of that out. What's left is a clean, single-user scheduling platform that runs entirely on your hardware. No telemetry unless you opt in. No features locked behind a key that might get revoked.

Why this changes everything

It's actually free.Not "free tier with limits." The entire codebase is MIT. Fork it, modify it, run it on a Raspberry Pi. Nobody can pull the rug.

Same UI quality as the paid product.This isn't some hobbyist rebuild. It's the same React + Next.js frontend Cal.com ships. Google Calendar sync, Zoom integration, custom event types, webhooks. All still there.

20+ integrations survive the fork. Google Calendar, Microsoft 365, Zoho, Zoom, Daily.co, HubSpot, Pipedrive, Basecamp. The enterprise stuff (SSO, SAML, org-level features) is gone. The individual-user integrations are untouched.

Docker Compose handles the whole stack. PostgreSQL, Redis, the web app, the API, and a database browser. One command.

Prerequisites

  • Docker and Docker Compose installed (Docker Desktop or Rancher Desktop both work)
  • A terminal. That's it.
  • Optional: a Google or Microsoft account if you want calendar sync later

Step 1: clone the repo

git clone https://github.com/calcom/cal.diy.git
cd cal.diy

Step 2: create your environment file

cp .env.example .env

Now generate the two secrets you actually need:

# Cookie encryption key
openssl rand -base64 32

# AES256 encryption key (must be 32 bytes)
openssl rand -base64 24

Open .env and paste those values into NEXTAUTH_SECRET and CALENDSO_ENCRYPTION_KEY. The defaults are literally the word "secret" which is fine for local testing but you should swap them anyway.

The database credentials (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB) have working defaults in the compose file. Leave them unless you have a reason to change them.

Step 3: start everything

docker compose up -d

This spins up five containers:

ContainerPortWhat it does
databaseinternal onlyPostgreSQL 13+
redis6379Caching and job queues
calcom3000The main web app
calcom-api80REST API v2
studio5555Prisma database browser

First boot takes a minute. The container runs database migrations and seeds the app store automatically. Watch progress with:

docker compose logs -f calcom

Wait until you see the Next.js server confirm it's listening.

Step 4: create your account

Open http://localhost:3000 in your browser.

The setup wizard launches on first visit. Fill in:

  1. Your username (this becomes your booking page URL)
  2. Full name
  3. Timezone
  4. Email and password

Skip the calendar connection for now. You can add it later from Settings > Integrations.

Step 5: create your first event type

Navigate to http://localhost:3000/event-typesand click "New Event Type."

Set:

  • Title: whatever you want ("30 Min Chat", "Quick Call", "Discovery")
  • Slug: auto-generated from the title
  • Duration: 15, 30, or 60 minutes
  • Description: one line explaining what the meeting is for

Under Availability, confirm your working hours look right. Save.

Step 6: book your first meeting

Your public booking page is live at:

http://localhost:3000/your-username

Open it in an incognito window (so you're not logged in) and book a slot on yourself. Pick a time, fill in the test booking form, confirm.

Back in your main window, check the Bookings tab. Your test meeting should be there. That's it. You have a working scheduling system.

Optional: connect Google Calendar

Go to Settings > Integrations > Google Calendar. You'll need OAuth credentials from the Google Cloud Console (a Client ID and Client Secret). The short version:

  1. Create a project in Google Cloud Console
  2. Enable the Google Calendar API
  3. Create OAuth 2.0 credentials (redirect URI: http://localhost:3000/api/integrations/googlecalendar/callback)
  4. Paste the Client ID and Secret into your .env as GOOGLE_API_CREDENTIALS

Once connected, cal.diy reads your existing calendar for conflicts and writes new bookings to it.

Optional: kill telemetry

Add this to your .env and restart:

CALCOM_TELEMETRY_DISABLED=1

Honest limitations

This is not a production deployment.Running on localhost means nobody else can book you unless you expose port 3000 to the internet (reverse proxy, Cloudflare Tunnel, or similar). That's a separate guide.

No teams, no orgs. Cal.diy explicitly removes multi-user features. If you need team scheduling, use Cal.com proper or pay for Calendly.

Updates require manual pulls. There's no auto-update mechanism. You docker compose down, pull the new image, and bring it back up. Breaking changes between versions are possible.

The Docker image is large. Next.js + Prisma + all the integrations means a ~2GB image. First pull takes a while on slower connections.

Google Calendar setup is fiddly.The OAuth flow requires a GCP project with correct redirect URIs. It works, but it's not a one-click setup like Calendly offers.

No email notifications without SMTP config. Out of the box, booking confirmations don't send unless you configure EMAIL_SERVER_HOST and related vars in .env. For local testing this doesn't matter. For real use, hook up an SMTP relay (Resend, Postmark, or Gmail SMTP).

Quick reference

TaskCommand / URL
Start the stackdocker compose up -d
Stop the stackdocker compose down
View logsdocker compose logs -f calcom
Access the apphttp://localhost:3000
Your booking pagehttp://localhost:3000/your-username
Database browserhttp://localhost:5555
Update to latestdocker compose down && docker compose pull && docker compose up -d
Kill telemetryAdd CALCOM_TELEMETRY_DISABLED=1 to .env
Generate secretsopenssl rand -base64 32

What's next

Once you've confirmed it works locally, the natural next steps are:

  1. Expose it to the internet (Cloudflare Tunnel is the easiest path for a homelab)
  2. Connect your real calendar
  3. Point a custom domain at it
  4. Set up SMTP so booking confirmations actually send

But for now, you have a fully functional Calendly replacement running on your machine. Zero monthly cost. Zero vendor lock-in.

The AI Side Hustle Cookbook

Liked this guide? Shout me a coffee.

$4.99 gets you the full playbook: 50 recipes you can build, ship, and get paid for with Claude Code. Working code in every one. The pricing, the deploy, the pitfalls. Every revision free for life.

Shout me a coffee