Build Status Windows Build Status

Xandikos is a lightweight yet complete CardDAV/CalDAV server that backs onto a Git repository.

Xandikos (Ξανδικός or Ξανθικός) takes its name from the name of the March month in the ancient Macedonian calendar, used in Macedon in the first millennium BC.

Implemented standards

The following standards are implemented:

The following standards are not implemented:

See DAV compliance for more detail on specification compliancy.


  • No multi-user support
  • No support for CalDAV scheduling extensions

Supported clients

Xandikos has been tested and works with the following CalDAV/CardDAV clients:

Client instructions

Some clients can automatically discover the calendar and addressbook URLs from a DAV server. For such clients you can simply provide the URL to Xandikos directly.

Clients that lack such automated discovery require the direct URL to a calendar or addressbook. One such client is Thunderbird lightning in which case you should provide a URL similar to the following:


At the moment, Xandikos supports Python 3.3 and higher as well as Pypy 3. It also uses Dulwich, Jinja2, icalendar, and defusedxml.

E.g. to install those dependencies on Debian:

sudo apt install python3-dulwich python3-defusedxml python3-icalendar python3-jinja2

Or to install them using pip:

python develop



To run a standalone (low-performance, no authentication) instance of Xandikos, with a pre-created calendar and addressbook (storing data in $HOME/dav):

./bin/xandikos --defaults -d $HOME/dav

A server should now be listening on localhost:8080.

Note that Xandikos does not create any collections unless --defaults is specified. You can also either create collections from your CalDAV/CardDAV client, or by creating git repositories under the contacts or calendars directories it has created.


The easiest way to run Xandikos in production is using uWSGI.

One option is to setup uWSGI with a server like Apache, Nginx or another web server that can authenticate users and forward authorized requests to Xandikos in uWSGI. See examples/uwsgi.ini for an example uWSGI configuration.

Alternatively, you can run uWSGI standalone and have it authenticate and directly serve HTTP traffic. An example configuration for this can be found in examples/uwsgi-standalone.ini.

This will start a server on localhost:8080 with username user1 and password password1.

mkdir -p $HOME/dav
uwsgi examples/uwsgi-standalone.ini


Contributions to Xandikos are very welcome. If you run into bugs or have feature requests, please file issues on GitHub. If you're interested in contributing code or documentation, please read CONTRIBUTING. Issues that are good for new contributors are tagged new-contributor on GitHub.


There is a #xandikos IRC channel on the Freenode IRC network, and a Xandikos mailing list.