Deployment guide

Cal.com goes closed source: 3 open-source scheduling alternatives

Deploy on a VPS Cloud →

Cal.com goes closed source: 3 open-source scheduling alternatives

Comparison9 min read6 steps

On April 14, 2026, Cal.com moved its commercial codebase to a private repository and relicensed the public code as Cal.diy (MIT), removing SSO, Teams, Workflows and Routing Forms. Users who had chosen Cal.com specifically for its AGPL are now faced with a choice: stay on an intentionally stripped-down cal.diy, upgrade to the closed commercial offer, or migrate to a truly free alternative. This article compares Rallly, Easy!Appointments and Tymeslot to help you decide.

Contents· What changed at Cal.com in April 20261/10
  1. 01What changed at Cal.com in April 2026
  2. 02Features removed from cal.diy compared to AGPL
  3. 03Requirements compared: RAM, CPU and stack per alternative
  4. 04Resource profiles per tool
  5. 05Deploy Rallly on a VPS with Docker Compose
  6. 06Rallly vs Easy!Appointments vs Tymeslot vs cal.diy
  7. 07Migrating from Cal.com AGPL: exporting your data
  8. 08Post-installation hardening
  9. 09Common troubleshooting
  10. 10Which alternative to choose?

What changed at Cal.com in April 2026

Cal.com published its decision on April 14, 2026: the rise of AI tools capable of scanning public code to detect vulnerabilities led the team to close the commercial codebase. Version v6.4 marks the tipping point.

The public repository calcom/cal.com was renamed calcom/cal.diy and relicensed from AGPL-3.0 to MIT. This change may look permissive at first glance — MIT is a permissive license — but the core issue is what was removed from the public code, not the license itself. Cal.diy is officially described as a tool for personal and non-production use: the cal.diy site explicitly recommends Cal.com (the closed version) for any commercial or production use.

Features removed from cal.diy compared to AGPL

  • Teams and Organizations: multi-member management and team spaces, now reserved for the closed Enterprise offer.
  • Workflows: reminder automations, notifications and triggered actions, absent from the public code.
  • SSO and SAML: single sign-on via your identity provider, removed from cal.diy.
  • Routing Forms: qualification forms to route bookings to the right team member, removed.
  • Instant Booking: immediate booking without manual confirmation, reserved for the commercial offer.
  • Insights: booking analytics dashboard, absent from the open code.
  • API v1: the legacy documented REST API, replaced by API v2 on the commercial side only.
  • AI phone agent: AI-powered scheduling via phone call, closed source.

Requirements compared: RAM, CPU and stack per alternative

Before choosing, verify that your VPS fits the tool's profile. The three alternatives have very different stacks — one in Node.js/PostgreSQL, one in PHP/MySQL, one in Elixir/PostgreSQL — which translates into different resource requirements and administration constraints.

Resource profiles per tool

  • Rallly (AGPL-3.0): Next.js + PostgreSQL via Docker Compose. Plan for at least 2 GB of RAM, 1 vCPU is sufficient for light load. A domain, SMTP relay and Docker Compose v2 are required. The official bundle includes PostgreSQL, S3-compatible object storage and an HTTPS reverse proxy — a single command gets you running.
  • Easy!Appointments (GPL-3.0): PHP 8.2+ + MySQL/MariaDB. Runs on any standard LAMP server or Docker. 512 MB of RAM is sufficient for individual or small-team use — the lightest of the three. Compatible with cPanel shared hosting, not just VPS.
  • Tymeslot (AGPL-3.0): Elixir/Phoenix LiveView + PostgreSQL bundled in the Docker container. Compiled stack, very low memory footprint at runtime. A single Docker container with bundled PostgreSQL — designed for a clean VPS installation.

Deploy Rallly on a VPS with Docker Compose

  1. Prepare the server

    Log in as root on your VPS. Install Docker and Docker Compose v2 if not already done:

    curl -fsSL https://get.docker.com | sh
    docker compose version

    Open ports 80 and 443 in your firewall. Point a subdomain (cal.your-domain.com) to your VPS IPv4 via a DNS A record.

  2. Get the official configuration

    Clone the Rallly self-hosted example repository and create your environment file:

    git clone https://github.com/lukevella/rallly-selfhosted.git
    cd rallly-selfhosted
    cp .env.example .env
  3. Configure environment variables

    Open .env and fill in the key variables:

    SECRET_PASSWORD=<random-32-char-string>
    NEXT_PUBLIC_BASE_URL=https://cal.your-domain.com
    SMTP_HOST=smtp.your-provider.com
    SMTP_PORT=587
    [email protected]
    SMTP_PWD=<smtp-password>
    [email protected]

    Generate the random string with openssl rand -hex 16. Do not leave SECRET_PASSWORD empty — Rallly will refuse to start without a non-empty value.

  4. Launch the containers

    Start the full stack in the background. The Rallly bundle includes the application, PostgreSQL, object storage and a reverse proxy with automatic TLS:

    docker compose up -d

    Verify all services are healthy:

    docker compose ps

    The reverse proxy obtains a Let's Encrypt certificate automatically on first start — wait one minute before accessing the domain.

  5. Verify the installation and create the first poll

    Open https://cal.your-domain.com in your browser. The Rallly interface does not require participants to create an account — only the organizer does. Create a first availability poll to verify that SMTP email delivery is working correctly.

    If email is not arriving, check the application service logs:

    docker compose logs app --tail=50
  6. Enable automatic updates (optional)

    To stay up to date without manual intervention, install Watchtower, which monitors new images and restarts affected containers:

    docker run -d \
      --name watchtower \
      -v /var/run/docker.sock:/var/run/docker.sock \
      containrrr/watchtower --cleanup --interval 86400

    Watchtower checks for new images once a day. Rallly regularly publishes security patches — do not leave your instance unmonitored.

Rallly vs Easy!Appointments vs Tymeslot vs cal.diy

Scroll the table

CriterionRalllyEasy!AppointmentsTymeslotcal.diy
LicenseAGPL-3.0GPL-3.0AGPL-3.0MIT (stripped code)
StackNext.js + PostgreSQLPHP 8.2 + MySQLElixir/Phoenix + PostgreSQLNext.js + PostgreSQL
Minimum RAM2 GB512 MBNot documented2 GB
Docker ComposeYes, official bundleYes, image availableYes, single containerYes
Primary use caseAvailability polls, group votingStructured appointments (services/providers)Individual and group schedulingIndividual scheduling (non-prod)
Calendar syncGoogle, Outlook (iCal)Google CalendarGoogle, Outlook, iCloud, CalDAV, NextcloudGoogle, Outlook
SSO / SAMLNoNoNoRemoved (commercial offer)
Multi-member TeamsNoMulti-provider (services)Yes (groups)Removed (commercial offer)
Workflows / auto remindersYes (emails)Yes (emails)Yes (emails, Slack, Telegram)Removed (commercial offer)
REST APIYesYes (full REST)Yes + webhooksAPI v2 only
Recommended for productionYesYesYesNo (official statement)
Maturity (2026)Active, v4.15.2 (Sept 2026)Active, v1.6.0 (May 2026)Active, launched in response to Cal.comMaintained, intentionally limited scope

Migrating from Cal.com AGPL: exporting your data

If you have been self-hosting Cal.com under AGPL and want to migrate to one of the alternatives, here is how to extract your data before shutting down your old instance.

Exporting from an existing Cal.com AGPL instance. Cal.com stores its data in PostgreSQL. You can export the bookings, availability and event type tables via pg_dump:

pg_dump -U calcom -d calcom -t bookings -t event_types -t schedules > calcom_export.sql

The data to prioritize: existing bookings (for your CRM history), participant email addresses (if you send reminders), and your availability rules (hours, blocked slots).

What you cannot import directly. None of the three alternatives offer import in Cal.com format — migration is a manual reconfiguration, not a restore. Focus on exporting your contact list and availability rules, then reconfigure event types in the target tool. For Rallly (group polls) or Tymeslot (individual booking links), reconfiguration typically takes less than an hour.

For Easy!Appointments, if you are coming from a system with structured services (30-minute slots per provider), this is the tool whose logic is closest to a traditional professional calendar. Import your providers and services via the admin interface, then reconfigure time slots.

Post-installation hardening

A few steps before exposing your instance to real traffic.

Protect admin access with HTTP basic authentication in front of your reverse proxy if the tool does not offer native 2FA — particularly important for Easy!Appointments on public access. Set up automatic backups of the PostgreSQL volume or MySQL data directory: a scheduled docker exec with pg_dump or mysqldump to external storage is sufficient. Verify that your VPS only exposes necessary ports (80/443 for web, 22 for SSH) and that direct access to the database port (5432 or 3306) is not open on the public interface.

Finally, enable release notifications on the GitHub repository of your chosen tool (Watch → Custom → Releases): all three projects are active in 2026 and regularly publish patches.

Common troubleshooting

Rallly: the application starts but emails are not arriving. Check SMTP_HOST, SMTP_PORT and SMTP_USER in your .env file. Some hosting providers block port 25 outbound — use port 587 (STARTTLS) or 465 (SSL). Inspect logs with docker compose logs app --tail=100 | grep -i smtp.

Easy!Appointments: 500 error or blank page after installation. Verify that the storage/ directory is writable by the web process (chmod -R 775 storage/). In Docker, check that the MySQL container is started and reachable before the application container — a depends_on with condition: service_healthy in your Compose resolves race condition startups.

Tymeslot: container starts but calendar sync fails. Google/Outlook sync requires OAuth2 credentials (Client ID and Client Secret) configured in environment variables. Create a project in the Google Cloud Console, enable the Google Calendar API, and set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET. The OAuth callback URL must exactly match your production domain.

Rallly: SECRET_PASSWORD must be set error. This variable is mandatory and must be at least 32 characters. Generate one with openssl rand -hex 16 (produces 32 hexadecimal characters) and set it in .env before running docker compose up -d again.

Which alternative to choose?

Rallly is the right fit if you need availability polls to find a time slot that works for multiple participants — team meetings, workshops, group calls. No real-time booking flow, but a lightweight collaborative vote with no friction. Its maturity (v4.15.2 in September 2026, complete official Docker bundle) makes it the easiest option to deploy.

Easy!Appointments is the right choice if your use case looks like a structured professional calendar: services (consultation, class, interview), providers, fixed slots and email confirmation. It works on cPanel shared hosting as well as VPS, making it accessible without Docker. Its version 1.6.0 (May 2026) is the most recent.

Tymeslot positions itself as the direct response to the departure of Cal.com AGPL: individual scheduling with booking links, multi-calendar sync (Google, Outlook, iCloud, CalDAV, Nextcloud), and webhook integrations for connecting to n8n or Make. Born in the wake of Cal.com's closure, it directly targets developers who were looking for an equivalent-scope alternative, with an AGPL license guaranteeing longevity.

Cal.diy remains an option if you only need a basic individual booking page with no commitment on feature longevity — the Cal.com team is explicit: cal.diy is not recommended for commercial production. If that is your starting point, Rallly or Tymeslot offer the same core features with a community that is not trying to upsell you.

Deploy your scheduling tool on a VPS

Rallly, Easy!Appointments and Tymeslot self-host on a root VPS with Docker. Root access, dedicated IPv4, choice of OS, no software restrictions.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab