Use Vdirsyncer with Netrc


This article describes how-to use vdirsyncer with netrc authentication


Over Christmas days, I came across a post on hunden's[1] website about caldav and cardav syncing in the terminal. That reminds me for fixing a long standing issue with my current setup. Currently, whenever I want to sync my calendar and tasks between my caldav server and my laptop I'm using the credentials stored in a keepass database. For accessing these credentials I wrote the following script that allows me to get the password for a given entry.



keepassxc-cli show -s "$db" "$entry" | grep Password | awk -F' ' '{print $2}'

I'm using this script mainly for vdirsyncer, where I configured it as a command for providing the password when needed.

password.fetch = ["command", "get-password", ""] 

However, that approach requires to provide your masterkey to unlock the keepass database every time you want to synchronize. Hence, makes it a bad choice for using it in a automatic sync setup. In other words, I want to find a way to sync my tasks every three hours by a cron job without interactively providing a password.

The .netrc file

I'm using fdm for a long time which makes the fetching of mails a breathe. Fdm is using the .netrc file[2] for storing machine and login information. So, the basic idea is to re-use the .netrc file and put my caldav credentials there. For accessing the credentials for a given host I wrote the following python script.

#!/usr/bin/env python3

import netrc
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-l", "--login", action="store_true", help="get username for the given host")
parser.add_argument("-p", "--password", action="store_true", help="get password for the given host")
args = parser.parse_args()

def main():
    netrc_file = netrc.netrc()
    login, _, password = netrc_file.hosts.get(
    if args.login:
    elif args.password:
        print(f"{login}, {password}")

if __name__ == "__main__":

I've put the new script into my bin directory under PATH where I can use it in combination with vdirsyncer. Here is the modified configuration line.

password.fetch = ["command", "~/bin/netrc-get", "-p", ""]

As a last step. Let's activate the synchronization every three hours in my crontab file.

0 3 * * * vdirsyncer sync


[1] hunden's post abot caldav and cardav via terminal
[2] the .netrc file