Radicale vs Baikal: CalDAV/CardDAV Servers Compared

Quick Verdict

Baikal is the better choice for most people. Its web admin interface makes managing users, calendars, and address books straightforward without touching config files. Radicale wins if you want the absolute smallest footprint and prefer file-based storage you can version-control with git.

Overview

CalDAV and CardDAV are open protocols for syncing calendars and contacts between devices. Every major client supports them — Apple Calendar, Thunderbird, GNOME Calendar, DAVx5 on Android. Self-hosting a CalDAV/CardDAV server means your calendar events and contacts live on hardware you control instead of sitting on Google’s or Apple’s servers.

Radicale and Baikal are the two most popular lightweight options. Both implement the CalDAV and CardDAV specs, both run in Docker, and both are licensed under GPL-3.0. The difference comes down to philosophy: Radicale strips everything to the minimum, while Baikal adds a web interface and database backend that make administration easier at the cost of slightly more resource usage.

Feature Comparison

FeatureRadicaleBaikal
LanguagePythonPHP
Web Admin UIUser management onlyFull calendar/contact/user management
Storage BackendFile-based (flat files)SQLite or MySQL
CalDAV SupportFullFull
CardDAV SupportFullFull
Authenticationhtpasswd, LDAP, PAM, customBasic Auth, Apache Auth
Multi-userYesYes
Calendar SharingYes (via ACL)Yes (via delegation)
Docker Image Size~25 MB~80 MB
RAM Usage (idle)~20 MB~40 MB
LicenseGPL-3.0GPL-3.0
Active DevelopmentYes (GitHub)Yes (GitHub)
ConfigurationSingle .conf fileWeb UI + config file
Backup ComplexityCopy a directoryExport SQLite DB or mysqldump

Docker Compose: Radicale

Create a docker-compose.yml:

services:
  radicale:
    image: tomsquest/docker-radicale:3.3.3.0
    container_name: radicale
    ports:
      - "5232:5232"
    volumes:
      - radicale_data:/data
      - ./config:/config:ro
    environment:
      # Set to your desired log level: info, warning, error, debug
      RADICALE_CONFIG: /config/config
    restart: unless-stopped

volumes:
  radicale_data:
    driver: local

Create a config/config file alongside it:

[server]
hosts = 0.0.0.0:5232

[auth]
type = htpasswd
htpasswd_filename = /data/users
htpasswd_encryption = bcrypt

[storage]
filesystem_folder = /data/collections

[logging]
level = info

Generate a user password file:

# Install htpasswd (part of apache2-utils on Debian/Ubuntu)
apt install -y apache2-utils

# Create the users file with your first user
htpasswd -B -c ./users youruser

Copy the users file into the Radicale data volume or mount it directly. Then start the stack:

docker compose up -d

Access the admin interface at http://your-server:5232. Log in with the credentials you created. From there, CalDAV/CardDAV clients connect to http://your-server:5232/youruser/ to discover calendars and address books.

Docker Compose: Baikal

Create a docker-compose.yml:

services:
  baikal:
    image: ckulka/baikal:0.10.1
    container_name: baikal
    ports:
      - "8080:80"
    volumes:
      - baikal_config:/var/www/baikal/config
      - baikal_data:/var/www/baikal/Specific
    restart: unless-stopped

volumes:
  baikal_config:
    driver: local
  baikal_data:
    driver: local

Start the stack:

docker compose up -d

Open http://your-server:8080 in your browser. Baikal walks you through a setup wizard on first launch:

  1. Set an admin password
  2. Choose SQLite (default, no extra setup) or MySQL as the database backend
  3. Create your first user account

Once setup is complete, the admin panel lets you create users, calendars, and address books through the web interface. CalDAV/CardDAV clients connect to http://your-server:8080/dav.php/ for autodiscovery.

Installation Complexity

Baikal is simpler to get running. You start the container, open the web UI, click through the setup wizard, and you have a working CalDAV/CardDAV server with user accounts. No config files to write, no htpasswd commands to run.

Radicale requires creating a configuration file and manually generating an htpasswd file before your first login. It is not difficult, but it is an extra step that Baikal eliminates. On the other hand, Radicale’s config file is roughly 15 lines long and easy to understand — there is no hidden complexity.

Performance and Resource Usage

Both servers are lightweight by any reasonable standard, but Radicale is notably leaner.

MetricRadicaleBaikal
Idle RAM~20 MB~40 MB
Docker image size~25 MB~80 MB
CPU at idleNegligibleNegligible
Storage overheadFlat files onlySQLite DB + flat files
Startup time<1 second~2 seconds

For a calendar and contacts server handling a household or small team, neither will stress even the cheapest VPS or a Raspberry Pi. The difference only matters if you are extremely resource-constrained or running dozens of other services on the same machine.

Storage and Backup

Radicale stores everything as .ics and .vcf files in a directory tree. Backing up means copying that directory. You can even version-control it with git, which gives you a full history of every calendar change. This is Radicale’s strongest feature for the backup-conscious.

Baikal stores data in a SQLite database by default (or MySQL if you configured it that way). Backing up means copying the SQLite file or running mysqldump. It works fine, but you lose the human-readable flat-file advantage. You cannot meaningfully diff a SQLite binary.

Client Compatibility

Both servers work with every standard CalDAV/CardDAV client:

  • iOS/macOS: Built-in Calendar and Contacts apps (add as “CalDAV” or “CardDAV” account)
  • Android: DAVx5 (the standard open-source sync adapter)
  • Thunderbird: Built-in CalDAV/CardDAV support
  • GNOME Calendar / Contacts: Native support
  • Evolution: Native support
  • Outlook: Via CalDAV Synchronizer plugin

Both support autodiscovery via .well-known URLs, so most clients can find calendars and address books automatically once you provide the server URL and credentials.

Community and Support

AspectRadicaleBaikal
GitHub Stars~3,000~2,500
Last Release20242024
DocumentationGood, conciseGood, with screenshots
Community SizeMediumMedium
Issue ResponseReasonableReasonable

Both projects have stable, mature codebases. Neither is at risk of abandonment — they solve a well-defined problem and do not require frequent updates. CalDAV and CardDAV are stable protocols.

Use Cases

Choose Radicale If…

  • You want the smallest possible resource footprint
  • You prefer flat-file storage you can back up with cp or rsync
  • You want to version-control your calendar data with git
  • You are comfortable editing a config file for setup
  • You are running on extremely constrained hardware (e.g., old Raspberry Pi with limited RAM)
  • You prefer fewer moving parts — no database, no PHP runtime

Choose Baikal If…

  • You want a web interface for managing users, calendars, and address books
  • You are setting this up for family members or a small team who should not need CLI access
  • You prefer database-backed storage with SQLite or MySQL
  • You want the easiest possible first-time setup (web wizard)
  • You might scale to MySQL later for a larger deployment
  • You want to manage everything through a browser

Final Verdict

Baikal is the right pick for most self-hosters. The web admin panel eliminates the need to SSH into your server every time you want to add a user or create a new calendar. For a household or small team, that convenience matters more than the 20 MB of RAM you save with Radicale.

Choose Radicale if you specifically value file-based storage — being able to git init your calendar directory and have a full version history of every event is genuinely useful, and no other CalDAV server offers that as cleanly. It is also the right choice if you are stacking dozens of services on minimal hardware and every megabyte counts.

Both are solid, mature, and reliable. You will not regret either choice.