Reclaim Your Contacts, Calendars, and Tasks

Baikal LogoMany people entrust their data (emails, contacts, calendars, todos) to service providers like Google, Yahoo!, Apple’s iCloud, Microsoft’s Office 365, and many others. There are also a considerable number of services which “hide” behind an app. Install it, and the first thing you’re force to do is to “sign in with your X account”, where “X” is the name of the app or company. All these options are utterly convenient because most of them are free, and easy to set up. The downsides are equally obvious: you give your data away to a 3rd party (privacy), you keep your data in a proprietary silo (no choice of clients), if the service provider decides to shut down your busted (single point of failure). Luckily, if you are using a shared web-hosting service, there is a simple solution which has no additional cost, uses international standards (wide choice of clients), is interoperable with just about any web-hosting service out there (no single point of failure), and your data remains solely in your hands (privacy)

This solution is called Baïkal and it’s a CalDAV and CardDAV server written in PHP. Setup is simple, quick, and painless.

Preconditions for this to work:

  1. The hosting provider must allow you to map subdomains to directories, so that when someone e.g. accesses “foo.yourdomain.tld” he gets delivered “/some/path/index.html” (i.e. mapping “foo” to “/some/path”).
  2. You must be able to bulk upload files to your web-space (e.g. via FTP).
  3. The server must be able to execute PHP.
  4. The hosting provider must allow you to set up a new MySQL database on the server to hold your contacts and calendars.

Precondition #1 is only needed if you want to run your website and your contacts/calendars/tasks from the same service. If you can use a dedicated service for your contacts/calendars/tasks, then #1 is not needed.

Most Baïkal installation instructions (including the official one) focus on how to set up your web server. But if you’re on a shared web-hosting, that’s already been done for you. Here, we will hence be focussing on how to get Baïkal up and running on your shared web-hosting service.

How to set it up:

  1. Download the ZIP file of the latest release from the fruux/Baikal releases page on github.
  2. Unpack the ZIP archive in a local directory
  3. Create a new subdirectory for your contacts/calendars server on your web server. We were already using productionsite and stagingsite subdirectories for our website, so we simply created a new directory called intranet. You may of course call it as you like; nobody will ever see that name.
  4. Upload the contents of the ZIP archive to that new directory. Uploading the Core, html, Specific, and vendor directories will suffice. The rest is informational material which is not needed for deployment, but won’t hurt if you accidentally also uploaded.
  5. Create a new subdomain in your shared web-hosting service’s admin portal, and assign it to the html directory in the new directory on your web server. If you e.g. named the directory intranet, make the new subdomain point to intranet/html.
  6. In your shared web-hosting account, configure a new MySQL database for your Baïkal server to store contacts and calendars.
  7. Fire up your web browser, and point it at the new subdomain via https: https://subdomain.yourdomain.tld/
  8. Follow the instructions of the Baïkal installer script that starts on your server. You will be assigning an admin password, and will need to provide information for Baïkal to access the new MySQL database, so keep that information handy.
  9. After you have completed the setup, point your browser to https://subdomain.yourdomain.tld/admin/ and login with your admin password. Have a look around to familiarise yourself with the interface. Select “Users and resources” from black the navbar at the top, and create user accounts for the people that will be using your service. A default address book and calendar will be created for each of them, so the accounts can be used without any further fiddling.

Now your contacts, calendar, and tasks server is up and running, and ready to use. So it’s time to connect the client apps. In you contacts, calendar, and todo apps, go to settings and create a new account. How this is done in detail will depend on the app you use. Specify the new subdomain as the server name (subdomain.yourdomain.tld), and make sure that “use SSL” or similar is activated. If there’s no checkbox, some apps allow you to specify the server as a URL (https://subdomain.yourdomain.tld). Enter the username and password that you assigned in the Baïkal admin interface when creating the user account. As the server path, enter /dav.php/principals/<username>/. This same configuration will work for contacts, calendars, and tasks.

What works, and what doesn’t

Well , what should I say? The server’s operation is impressively unimpressive. It just works, and it does that fast and very reliably. We started using Baïkal when it was still version 0.2.7 some two years ago. No headaches, just worked since then. Since the 0.4 versions you can see availability and accept/decline status for users on the same Baïkal server. The only thing that we kind of miss is that no invitation emails are sent when you add an invitee to a calendar appointment. But that may well come in a future release.

As a service

The lead developers behind Sabre DAV and Baïkal,, also offer a calendar and contacts server service on their website. In addition to the pure hosting of contacts and calendars that you get with the self-hosted solution described here, on you will get some extra bells and whistles for deployment in a company , like e.g. a web client for contacts, calendars, and tasks, a web client for team management (the Baïkal admin interface may not be for everyone), and many add-on features easing collaboration. If you don’t feel like setting up your own, head over to to check out their service!