Deploy Radicale
Calendar, task and contact server that syncs to your phone and laptop
radicale
Just deployed
/data
Deploy and Host Radicale on Railway
Radicale is a small CalDAV and CardDAV server that holds your calendars, to-do lists and contacts and syncs them to every device you own. It speaks the open standards Apple Calendar, Thunderbird, DAVx⁵ and Evolution already use, so nothing needs a plugin — add an account, point it at a URL, and your appointments live on infrastructure you control. It stores each calendar as ordinary iCalendar and vCard files and needs no database, which makes it the usual answer for scheduling without a groupware suite attached.
Deploy Radicale on Railway and this template gives you a working server rather than a blank one. A single radicale service runs the upstream ghcr.io/kozea/radicale:stable image behind a wrapper that writes Radicale's configuration and password file from the variables you fill in, so there is nothing to upload and no shell to log into. A volume at /data holds every collection, and CalDAV, CardDAV and the browser interface all answer on one public HTTPS domain.

Getting Started with Radicale on Railway
Set RADICALE_ADMIN_USERNAME and RADICALE_ADMIN_PASSWORD before you deploy — there are no default credentials, and the container refuses to start without a password rather than expose an open server. Once it is live, open https:///.web/ and sign in. The first authenticated request creates your storage and seeds a Personal Calendar and Personal Address Book, so the screen is not empty.
The green + button creates a collection: pick a type, give it a URL fragment, title, description and colour, and it appears as a card with a copyable address. That address goes into your client. On Android, DAVx⁵ takes the base URL https:/// with your credentials and finds every collection itself; on macOS and iOS, add a CalDAV account with the same address. Thunderbird takes a single collection URL under New Calendar → On the Network.
To confirm it works, create an event on your phone and reload the web interface — the item count rises within a sync cycle. To add people, put their logins in RADICALE_EXTRA_USERS as comma-separated user:password pairs; each gets private storage on first sign-in, and owner_only keeps them out of each other's calendars.

About Hosting Radicale
Most calendar hosting comes bundled with something much larger. A groupware suite gives you calendars alongside files, chat and mail, and charges you in memory and maintenance for all of it. Radicale implements CalDAV (RFC 4791) and CardDAV (RFC 6352) well enough that standard clients treat it as any other server, and does nothing else.
- CalDAV and CardDAV in one server — events, journals, tasks and contacts, with the calendar-query reports clients depend on
- Plain-file storage — every item is an
.icsor.vcffile, so a backup is a copy and a restore is a copy back - Per-user isolation —
owner_onlyrights give each account its own namespace - Built-in web interface — create, rename, recolour, upload and delete collections from a browser
- Optional git history — each change is committed, so a deleted calendar leaves an undo trail
- htpasswd authentication — bcrypt credentials, plus LDAP, IMAP, PAM, Dovecot and OAuth2 backends
The architecture is deliberately flat. The radicale service is the whole application: it terminates client requests, authenticates them against a password file rebuilt on each boot from your variables, and reads and writes collection files on the volume. No database, no object storage.
Why Deploy Radicale on Railway
Railway removes the parts of self-hosting that have nothing to do with calendars:
- HTTPS and a public domain are provisioned for you — CalDAV clients refuse plaintext
- The volume is managed and survives every redeploy
- Configuration is variables, not a file you SSH in to edit
- Usage-based pricing suits a service that idles almost all day
Common Use Cases
- Replacing Google Calendar and Contacts for a person or household, keeping phones and laptops in sync with no data broker in between
- A small team's shared scheduling — separate logins, one server, no seat licence
- Backing an automation that writes appointments over CalDAV: booking systems, on-call rotations, release schedules
- Contact storage for a CRM or mail client that speaks CardDAV but has nowhere to put contacts
Dependencies for Radicale
ghcr.io/kozea/radicale:stable— the upstream image, currently Radicale 3.8.0.latestthere is the nightly master build;stabletracks tagged releases- Source repository:
https://github.com/gridalpha/radicale-railway— adds the boot-time configuration renderer and health endpoint - A volume mounted at
/data, holdingcollections/
Environment Variables Reference
| Variable | Default | Purpose |
|---|---|---|
RADICALE_ADMIN_USERNAME | admin | Login for the first account |
RADICALE_ADMIN_PASSWORD | — | Password for it; required |
RADICALE_EXTRA_USERS | empty | More logins as user:password, comma separated |
RADICALE_RIGHTS_TYPE | owner_only | owner_only, owner_write, authenticated or from_file |
RADICALE_GIT_VERSIONING | true | Commit every change to a git repository in the collections folder |
RADICALE_HTPASSWD_ENCRYPTION | bcrypt | Hash used in the password file |
RADICALE_MAX_CONNECTIONS | 32 | Parallel connections accepted |
RADICALE_LOG_LEVEL | info | debug, info, notice, warning, error |
Accounts are rebuilt from these variables on every boot, so a password change is a variable edit. Removing a login removes access but leaves its collections on the volume.
Deployment Dependencies
- Source and documentation:
https://github.com/Kozea/Radicale - Configuration reference:
https://radicale.org/v3.html - Container image:
https://github.com/Kozea/Radicale/pkgs/container/radicale
Hardware Requirements for Self-Hosting Radicale
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 0.1 vCPU | 0.5 vCPU |
| RAM | 128 MB | 512 MB |
| Storage | 1 GB volume | 5 GB volume |
| Runtime | Python 3.9+ | Python 3.12+ |
Calendar data is tiny — a decade of household appointments is single-digit megabytes. Size the volume for attachments and history.
Self-Hosting Radicale Elsewhere
Radicale installs from PyPI. This runs it on port 5232 with bcrypt passwords:
pip install "radicale[bcrypt]"
htpasswd -B -c /etc/radicale/users alice
python3 -m radicale --config /etc/radicale/config
A minimal configuration file, at /etc/radicale/config:
[server]
hosts = 0.0.0.0:5232, [::]:5232
[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt
[storage]
filesystem_folder = /var/lib/radicale/collections
Running it yourself also means a TLS certificate, a reverse proxy and a backup job, since CalDAV clients will not send credentials over plain HTTP.
Is Radicale Free?
Radicale is free and open-source under the GPLv3, with no paid tier, licence key or seat limit — create as many accounts and calendars as your storage allows. The only cost of running it on Railway is infrastructure: a low-CPU container and a small volume, billed by usage.
FAQ
What is Radicale? An open-source CalDAV and CardDAV server. It stores calendars, tasks and contacts as standard files and serves them to any client that speaks those protocols — Apple Calendar, Thunderbird, DAVx⁵, Evolution.
What does this Railway template deploy?
One radicale service running the official image, with a volume at /data for collections and a public HTTPS domain. The first account comes from the username and password you supply, and each account starts with a calendar and address book already made.
Why is there no database in this template?
Radicale's storage backend is the filesystem — each event is an .ics file, each contact a .vcf. A database would serve no purpose, so the volume is the only persistence layer and a backup is a folder copy.
How do I connect my iPhone or Android phone to a self-hosted Radicale server?
On iOS, add a CalDAV account under Settings with the server address https:/// and your credentials; contacts use a CardDAV account with the same values. Android's DAVx⁵ takes that base URL and finds every collection.
Can several people share one Radicale deployment?
Yes. Put extra logins in RADICALE_EXTRA_USERS as comma-separated user:password pairs. With owner_only permissions each sees only its own collections; set RADICALE_RIGHTS_TYPE to authenticated to share one pool.
How do I recover a calendar a client deleted by accident?
Leave RADICALE_GIT_VERSIONING at true. Every change is committed to a git repository inside the collections folder, so deleted items stay in the history.
Does Radicale support recurring events and shared tasks?
Yes. It handles VEVENT, VTODO and VJOURNAL components including recurrence rules, and answers the calendar-query and free-busy reports clients use to expand them, with limits that stop a malformed rule exhausting it.
Template Content
radicale
gridalpha/radicale-railway