$linuxjunkies
>

Calendar and Contacts on Linux

Sync Google Calendar, iCloud, and Nextcloud to Linux using CalDAV/CardDAV, GNOME Online Accounts, Evolution, Thunderbird, and vdirsyncer.

BeginnerUbuntuDebianFedoraArch9 min readUpdated June 7, 2026

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

  1. Open Evolution. Go to File → New → Calendar.
  2. Set Type to CalDAV.
  3. 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.
  4. Enter your username (email address) and the app password when prompted.
  5. Click Apply. Evolution fetches the calendar list and begins syncing.

Adding a CardDAV Address Book

  1. Go to File → New → Address Book.
  2. Set Type to CardDAV.
  3. Enter the CardDAV server URL, your username, and app password.
  4. 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-registry and re-open Evolution. If it persists, check journalctl --user -u evolution-source-registry -f for TLS or DNS errors.
  • GNOME Online Accounts entry disappears after reboot: This sometimes affects GNOME under Wayland with keyring issues. Ensure gnome-keyring is 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, or verify_cert = false for testing only.
tested on:Ubuntu 24.04Fedora 40Arch rollingDebian 12

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