Calendar and Contacts on Linux
Sync Google Calendar, iCloud, and Nextcloud to Linux using CalDAV/CardDAV, GNOME Online Accounts, Evolution, Thunderbird, and vdirsyncer.
Before you start
- ▸A CalDAV/CardDAV-compatible account (Google, iCloud, Nextcloud, or similar)
- ▸App Password or OAuth credentials generated for your account provider
- ▸A desktop environment installed (GNOME, KDE, or another; vdirsyncer works headless)
- ▸sudo privileges to install packages
Keeping your calendar and contacts in sync across devices on Linux used to mean wrestling with proprietary clients and half-working workarounds. Today, GNOME Online Accounts, Evolution, and a handful of solid CalDAV/CardDAV tools make it straightforward to connect Google Calendar, iCloud, Nextcloud, or any standards-compliant server to your Linux desktop. This guide covers the full stack: the protocols, the GNOME integration layer, Evolution as a full-featured client, and manual CalDAV/CardDAV setup where the GUI falls short.
Understanding CalDAV and CardDAV
CalDAV (RFC 4791) and CardDAV (RFC 6352) are open, HTTP-based protocols that sit on top of WebDAV. Almost every major calendar and contacts service speaks them — Google, Apple iCloud, Nextcloud, Fastmail, Proton Calendar, and self-hosted solutions like Radicale and Baikal. Your Linux client connects to a URL endpoint and syncs data directly; no vendor app required.
Key service endpoints you will need:
- Google: CalDAV —
https://www.google.com/calendar/dav/; CardDAV —https://www.googleapis.com/carddav/v1/ - iCloud: CalDAV —
https://caldav.icloud.com; CardDAV —https://contacts.icloud.com - Nextcloud: both at
https://yourserver.example.com/remote.php/dav/
Google requires an App Password when 2-Step Verification is enabled (your main password will be rejected). iCloud always requires an app-specific password from appleid.apple.com. Generate these before you start.
Method 1: GNOME Online Accounts (Quickest for GNOME Users)
GNOME Online Accounts (GOA) is the fastest path if you run GNOME. It authenticates once and exposes calendars and contacts to every GNOME-aware application — GNOME Calendar, Contacts, Evolution, and even Geary.
Adding a Google Account
Open Settings → Online Accounts → Add Account → Google. An OAuth browser window opens; log in and grant access. Toggle on Calendars and Contacts. No passwords are stored in plain text — GOA uses OAuth tokens refreshed automatically.
Adding an iCloud Account
GNOME does not have a dedicated iCloud provider. Use the generic CalDAV/CardDAV provider entry (labeled "GNOME Calendar" and "Contacts" after setup). In Settings → Online Accounts choose NextCloud or CalDAV account depending on your GNOME version. Enter the iCloud CalDAV URL, your Apple ID email, and the app-specific password. Repeat with the CardDAV URL for contacts.
On GNOME 44 and later, a dedicated CalDAV account type is listed directly:
# Verify GOA version bundled with your desktop
goa-daemon --version
Verifying GNOME Integration
Once added, open GNOME Calendar — events should populate within a minute. Open GNOME Contacts for the address book. If nothing appears, restart the GNOME session services:
systemctl --user restart gnome-online-accounts gnome-calendar-server
Method 2: Evolution — Full PIM Client
Evolution is the most capable open-source PIM client on Linux. It handles email, calendar, contacts, and tasks in one window, and its CalDAV/CardDAV support is mature and reliable. It also consumes GOA accounts automatically when both are installed.
Installing Evolution
# Debian / Ubuntu
sudo apt install evolution evolution-data-server gnome-online-accounts
# Fedora / RHEL family
sudo dnf install evolution evolution-data-server
# Arch
sudo pacman -S evolution evolution-data-server
Adding a CalDAV Calendar Manually
- Open Evolution. Go to File → New → Calendar.
- Set Type to CalDAV.
- Enter a display name and the full CalDAV URL. For Google, the URL is
https://www.google.com/calendar/dav/YOUR_EMAIL/events/— substitute your Gmail address. - Enter your username (email address) and the app password when prompted.
- Click Apply. Evolution fetches the calendar list and begins syncing.
Adding a CardDAV Address Book
- Go to File → New → Address Book.
- Set Type to CardDAV.
- Enter the CardDAV server URL, your username, and app password.
- Click Find Address Books — Evolution queries the server and lists available books. Select the ones you want and click Apply.
Syncing Frequency
Evolution syncs on a schedule and on demand. To force an immediate sync of all sources:
evolution --force-online
Or press F5 inside the Calendar or Contacts view.
Method 3: Thunderbird with Lightning (Non-GNOME Desktops)
On KDE Plasma, XFCE, or other desktops without GOA, Thunderbird with its built-in calendar (Lightning is now integrated) is a solid alternative.
# Debian / Ubuntu
sudo apt install thunderbird
# Fedora
sudo dnf install thunderbird
# Arch
sudo pacman -S thunderbird
In Thunderbird: Calendar tab → New Calendar → On the Network → CalDAV. Paste the CalDAV URL, enter credentials, and Thunderbird discovers and imports the calendars. For Google specifically, the TbSync extension combined with the Provider for Google Calendar add-on handles OAuth properly and is worth installing for a smoother experience.
Method 4: KDE / Akonadi with KOrganizer
KDE users have KOrganizer (calendar) and KAddressBook backed by the Akonadi data framework, which has native CalDAV and CardDAV support.
# Arch (KDE Plasma)
sudo pacman -S korganizer kaddressbook akonadi-calendar
# Fedora
sudo dnf install korganizer kaddressbook
Go to System Settings → Online Accounts (KDE has its own GOA-equivalent). Add a Google, Nextcloud, or generic CalDAV/CardDAV account there. Akonadi picks it up automatically and feeds both KOrganizer and KAddressBook.
Command-Line Sync with vdirsyncer
For a server, a headless machine, or users who prefer local files synced with a tool rather than a running daemon, vdirsyncer is the standard choice. It syncs CalDAV/CardDAV servers to local .ics / .vcf files that any client (including khal and khard) can read.
# Install
sudo apt install vdirsyncer # Debian/Ubuntu
sudo dnf install vdirsyncer # Fedora
sudo pacman -S vdirsyncer # Arch
# Or via pip in a venv
python3 -m venv ~/.local/vdirsyncer
~/.local/vdirsyncer/bin/pip install vdirsyncer
A minimal ~/.config/vdirsyncer/config for Google Calendar:
[general]
status_path = "~/.local/share/vdirsyncer/status/"
[pair google_cal]
a = "google_cal_local"
b = "google_cal_remote"
collections = ["from b"]
conflict_resolution = "b wins"
[storage google_cal_local]
type = "filesystem"
path = "~/.local/share/calendars/google/"
fileext = ".ics"
[storage google_cal_remote]
type = "caldav"
url = "https://www.google.com/calendar/dav/[email protected]/"
username = "[email protected]"
password = "YOUR_APP_PASSWORD"
# First run — discover and confirm collections
vdirsyncer discover google_cal
# Sync
vdirsyncer sync
Automate with a systemd user timer rather than cron:
# ~/.config/systemd/user/vdirsyncer.service
# [Unit]
# Description=vdirsyncer sync
# [Service]
# ExecStart=/usr/bin/vdirsyncer sync
systemctl --user enable --now vdirsyncer.timer
Verification
After setup, confirm sync is working:
# For vdirsyncer — check local .ics files were created
ls -lh ~/.local/share/calendars/google/
# For Evolution / GNOME — check evolution-data-server is running
systemctl --user status evolution-source-registry
Create a test event in Google Calendar on your phone or web, wait 60 seconds, then check whether it appears in your Linux client. If it does, the full round-trip is confirmed.
Troubleshooting
- Authentication failures with Google: Your main Google password will not work if 2FA is on. Generate an App Password at myaccount.google.com/apppasswords.
- iCloud "Forbidden" errors: iCloud always requires an app-specific password regardless of 2FA status. Do not use your Apple ID login password.
- Evolution shows no events after adding account: Run
systemctl --user restart evolution-source-registryand re-open Evolution. If it persists, checkjournalctl --user -u evolution-source-registry -ffor TLS or DNS errors. - GNOME Online Accounts entry disappears after reboot: This sometimes affects GNOME under Wayland with keyring issues. Ensure
gnome-keyringis running:systemctl --user status gnome-keyring-daemon. - vdirsyncer SSL certificate errors: On self-hosted servers with self-signed certs, add
verify_cert = "/path/to/ca.pem"to the storage block, orverify_cert = falsefor testing only.
Frequently asked questions
- Can I sync Google Calendar without giving Evolution my Google password?
- Yes. Use GNOME Online Accounts to authenticate via OAuth — your password never touches Evolution directly. Alternatively, generate a Google App Password which is a revocable token, not your actual account password.
- Does this work on Wayland?
- Yes. Evolution, GNOME Calendar, GNOME Online Accounts, and vdirsyncer are all Wayland-compatible. The only common issue is the GNOME keyring daemon not starting automatically in some Wayland compositors; ensure gnome-keyring-daemon is running so stored passwords survive reboots.
- What is the difference between GNOME Online Accounts and configuring Evolution directly?
- GNOME Online Accounts is a shared credential store — add once and every GNOME app (Calendar, Contacts, Evolution, Geary) uses it. Configuring Evolution directly is self-contained and works without GNOME or GOA, useful on KDE or minimal desktops.
- Can vdirsyncer handle iCloud?
- Yes. Set the CalDAV URL to https://caldav.icloud.com and the CardDAV URL to https://contacts.icloud.com, use your Apple ID email as the username, and an app-specific password. iCloud's discovery endpoint works correctly with vdirsyncer's caldav and carddav storage types.
- Is there a lightweight option that does not require installing Evolution or Thunderbird?
- Yes. vdirsyncer syncs data to local files; khal (calendar) and khard (contacts) are minimal terminal clients that read those files. This stack works well on tiling window manager setups and servers without a full desktop environment.
Related guides
Linux Clipboards Explained (+ Clipboard Managers)
Learn the difference between Linux's PRIMARY and CLIPBOARD selections, use xclip, xsel, and wl-clipboard from the terminal, and manage history with GPaste or Klipper.
Configure LibreOffice for Daily Use
Configure LibreOffice for daily use: set default save formats for MS Office interop, tune autosave, install fonts, and add productivity extensions.
Configure the Touchpad and Multitouch Gestures
Configure Linux touchpad behavior and multitouch gestures using libinput, libinput-gestures, and native GNOME and KDE Plasma settings on both Wayland and X11.
Wayland vs X11: How to Choose and Configure Each
Know when to run Wayland or X11, how to check your current session, switch at login with GDM/SDDM/LightDM, and handle NVIDIA and XWayland edge cases.