Setting up a Shared Family Calendar with Baikal

My wife is an iPhone person and I am an Android person. Beyond the occasional annoyance this causes when it comes to sharing media via MMS, one of the bigger issues this caused in our married lives came down to sharing calendars. I was never able to see what was on her calendar, which, with her as the primary person shlepping the kids around, means I had to rely on my memory to recall wherever she was with the kids at any given moment. Likewise, she was never sure what I was up to, outside of work. When we shared a car it was even worse. My schedule was entirely dependent on her, and her schedule was a blind spot to me.

Failed Solutions

Of course the obvious solution was to rely on a paper calendar, but being that we are both bad about updating our digital calendars as it is, it’s even less likely that we’d keep a paper calendar updated. This solution didn’t last long for us.

There are third party sync solutions out there, such as CalendarBridge or onecal.io, which can sync your calendars together, but those cost money, which is not in the budget. That idea was also quickly scrapped.

Googling the issue provides a lot of potential solutions. Every guide out there got us started with high expectations and then we’d run into the same issues again and again. It seemed simple: even if all we could do would be to add her calendar as a subscription to my Google calendar and vice versa with mine - that didn’t work either.

What Eventually Worked

It took stepping away from the Google ecosystem altogether to make this work, and stepping out into the unknown for me. As is often the solution in these cases, an open standard and open source software came to the rescue.

The Solution: CalDAV on Baikal

CalDAV is an established standard for internet calendars which allows clients to access and manage calendar data on a centralized server. Apple allows users to add CalDAV calendars to their calendar. This critical information made everything click in my head. We’d setup a Closely related to CalDAV is CardDAV, which is a

Baikal vs. Other Software

I ultimately decided to go with Baikal after reviewing the software options that are available for simple CalDAV servers. When I say “simple CalDAV server”, I mean that I didn’t want any additional features beyond actually hosting the CalDAV and CardDAV back end. I didn’t want anything beyond a simple admin interface on the web. The reason this distinction is important is that there is a third option here for a self hosted CalDAV server, and that is Nextcloud. However, having experimented with Nextcloud in the past, I’ve found it to be bloated and buggy. It comes with a whole suite of other features I have no interest in. Pretty diametrically opposed to the simple and “it just works” kind of solution I was seeking for a calendar server.

In the arena of “simple” open source CalDAV servers, there are essentially a couple of options: Baikal and Radicale. I won’t dig into the differences too much, because feature-wise they are very similar. The main benefit to Baikal is that it more easily supports multiple users and handles permissioning issues better.

Implementation on Docker

I ended up deploying Baikal on Docker on my VPS Dasha, which is a box I rent from Hetzner. I manage my stacks through Komodo, so deployment is as easy as putting my docker-compose.yml file in Gitea, adding the repo and stack to Komodo, along with and a procedure to redeploy the stack on git push, and clicking deploy in Komodo. Actually deploying Baikal was a relatively simple process, thanks to a couple of useful reddit threads and this very helpful blog post. Setting up everything else (e.g., the CalDAV clients) took a little longer, but overall the process was simple.

I’m sure it qualifies as overkill for my purposes, but I went with a Postgres database instead of the default SQLite. The truth is SQLite is more than enough unless you have a large number of users. The other peculiarity in my setup is I only wanted the admin panel accessible via my Tailscale network. I used Traefik middleware to restrict my traffic appropriately, since I’m already using Traefik as a reverse proxy.

Client Implementation

The Baikal implementation is only one half of the solution, however, the other half being the client side. Hooking up the iPhone to the CalDAV server and setting it up as the default was a piece of cake. On my side with the Android, things were only slightly more complicated. First I setup sync using a little free app called DAVx5. Then I began the somewhat arduous search for a calendar app I can use. So far I’m using aCalendar, and it’s okay — not great, but serviceable. On desktop I can use the FastMail client, which is fantastic.

Final Thoughts

It was a journey, but I managed to get to the place I wanted. My wife’s default calendar on her iPhone is our shared family calendar. It’s also my default calendar and events from my email go there. The only other calendar I maintain is my work calendar, but let’s face it - that’s not going away any time soon.