Own Your Calendar Data Without the Cloud
Most people hand their scheduling and contact data to Google or Apple without a second thought. Radicale changes that calculus entirely – it is a lightweight, open-source CalDAV and CardDAV server you can run on a $35 Raspberry Pi or any Linux box you already own, giving you full control over who touches your data and when.

What Radicale Is and Why It Works
Radicale is a Python-based server that speaks CalDAV for calendars and CardDAV for contacts, which are the same protocols Apple Calendar, Thunderbird, and most Android apps already understand natively. That matters because you will not need to install special client software on any device. If your phone can sync with Google Calendar, it can sync with Radicale just as easily once you point it at your own server address.
The project is deliberately minimal. It has no database engine behind it – events and contacts are stored as plain .ics and .vcf files in a directory on your filesystem. This makes backups trivially simple: zip the folder, copy it somewhere safe, done. It also means recovery from a failed server is fast, because you are not dealing with database migrations or binary formats you cannot read in a text editor.
Radicale does not include a polished web UI for browsing calendars, and it does not pretend to. It is infrastructure, not an application. Think of it the way you think of a mail server: you do not open Postfix to read email, you use a mail client. Radicale handles the sync layer, and every client you already own handles the display layer.
Authentication is built in through a basic htpasswd file, which keeps the setup approachable for anyone comfortable with the command line. If you want to expose Radicale to the internet securely, pairing it with a reverse proxy that handles TLS is the standard approach – and if you need a solid reverse proxy option, Caddy handles automatic HTTPS certificate provisioning with almost no configuration overhead.
Installing and Configuring Radicale Step by Step
Start by installing Python 3 and pip if they are not already present, then install Radicale with a single command: pip install radicale. On Debian or Ubuntu, you may prefer to install via apt with sudo apt install radicale, which also sets up a system user and a basic init script automatically. Either path works, but the pip route gives you the latest release without waiting for distribution package maintainers to catch up.
Create the configuration directory at /etc/radicale/ and place a file named config inside it. The configuration file uses an INI-style format broken into sections. The most important sections to define immediately are [server], [auth], and [storage]. Under [server], set hosts = 0.0.0.0:5232 to listen on all interfaces, or restrict it to 127.0.0.1:5232 if you plan to proxy through Nginx or Caddy and do not want the port exposed directly. Under [auth], set type = htpasswd and point htpasswd_filename at a file you will create next. Under [storage], set filesystem_folder to wherever you want calendar and contact files to live, such as /var/lib/radicale/collections.

Generate the password file using Apache’s htpasswd utility or the Python equivalent. If Apache tools are installed, run: htpasswd -c /etc/radicale/htpasswd yourusername and enter a password when prompted. If you prefer a pure Python approach, install the passlib library and generate a bcrypt hash manually. Once the file exists, set htpasswd_encryption = bcrypt in the config to tell Radicale how to verify passwords – plain MD5 or SHA-1 hashes are technically supported but not appropriate for anything exposed to a network.
Create the storage directory and assign ownership to the radicale system user: sudo mkdir -p /var/lib/radicale/collections and sudo chown -R radicale:radicale /var/lib/radicale. Then start the service with sudo systemctl start radicale and enable it to survive reboots with sudo systemctl enable radicale. Test it by opening a browser and navigating to http://localhost:5232 – you should see a plain login prompt. A successful login that returns an empty but valid response means the server is running correctly.
If you are exposing Radicale externally, place a reverse proxy in front of it and terminate TLS there rather than inside Radicale itself. A minimal Caddy block pointing to localhost:5232 handles this without touching a single certificate file manually. Once your domain is resolving to your server, Caddy requests a certificate from Let’s Encrypt automatically. After that, the full URL clients need is https://yourdomain.com/ with the path to the specific user collection appended – typically /yourusername/ for the principal URL.
Connecting Clients to Your Radicale Server
On iPhone and iPad, go to Settings > Calendar > Accounts > Add Account > Other > Add CalDAV Account. Enter your server URL, username, and password. iOS will auto-discover collections once the credentials validate. For contacts, follow the same path but choose Add CardDAV Account instead. Android users running stock calendar apps will need a third-party sync client – DAVx5 is the standard choice and is available on F-Droid as a fully free download. After installing DAVx5, add an account using the base URL and your credentials, and it discovers both calendar and contact collections in one pass.

On desktop, Thunderbird with its built-in calendar handles CalDAV natively without any extension since version 91. Add a new calendar, select “On the Network,” choose CalDAV, and paste the full collection URL. The collection URL follows a predictable pattern: https://yourdomain.com/yourusername/collectionname.ics/. If you are not sure what your collection names are, browse the storage directory on the server – every calendar or address book you created appears as a subdirectory with a .ics or .vcf extension. New collections can also be created directly from the client, and Radicale will write them to disk automatically. The question most people hit at this point is not whether Radicale works – it does – but whether they want to keep managing the reverse proxy, the password file, and the backup job long-term, or whether a managed alternative like Nextcloud is worth the added complexity.





