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.diyStep 2: create your environment file
cp .env.example .envNow generate the two secrets you actually need:
# Cookie encryption key
openssl rand -base64 32
# AES256 encryption key (must be 32 bytes)
openssl rand -base64 24Open .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 -dThis spins up five containers:
| Container | Port | What it does |
|---|---|---|
database | internal only | PostgreSQL 13+ |
redis | 6379 | Caching and job queues |
calcom | 3000 | The main web app |
calcom-api | 80 | REST API v2 |
studio | 5555 | Prisma 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 calcomWait 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:
- Your username (this becomes your booking page URL)
- Full name
- Timezone
- 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-usernameOpen 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:
- Create a project in Google Cloud Console
- Enable the Google Calendar API
- Create OAuth 2.0 credentials (redirect URI:
http://localhost:3000/api/integrations/googlecalendar/callback) - Paste the Client ID and Secret into your
.envasGOOGLE_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=1Honest 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
| Task | Command / URL |
|---|---|
| Start the stack | docker compose up -d |
| Stop the stack | docker compose down |
| View logs | docker compose logs -f calcom |
| Access the app | http://localhost:3000 |
| Your booking page | http://localhost:3000/your-username |
| Database browser | http://localhost:5555 |
| Update to latest | docker compose down && docker compose pull && docker compose up -d |
| Kill telemetry | Add CALCOM_TELEMETRY_DISABLED=1 to .env |
| Generate secrets | openssl rand -base64 32 |
What's next
Once you've confirmed it works locally, the natural next steps are:
- Expose it to the internet (Cloudflare Tunnel is the easiest path for a homelab)
- Connect your real calendar
- Point a custom domain at it
- 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.