The last few weeks I’ve been looking into the open calendar, tasks and notes space with the goal of finding or building a privacy-conscious and still practical system. This post is an exploration of the available technology in that space, its problems and how to solve them.
For context: I use Windows, MacOS and Linux on my computers on a daily basis, my daily driver phone is an iPhone. I don’t care much for collaboration with other people using these tools, my focus is to keep control over my personal data and build a workflow that works well for my day to day work.
When I set out on my journey I had the following goals in mind:
My ideal solution would be an open source CalDAV/WebDAV server storing data, and a cross-platform client that works on all desktop/mobile platforms. I can live with a different desktop and mobile app but I do not want to have 3 different desktop GUIs.
CalDAV and iCalendar are the established standard protocols for synchronizing calendars and tasks but these protocols have some issues:
It’s not all bad, CalDAV has good support for synchronizing resources and limiting sync to only objects that have changed by using etags metadata and sync tokens.
WebDAV is a good standard for synchronizing files and since most note apps are just markdown editors with sync capabilities notes are not as problematic. Hence I will mainly focus the rest of this post on calendars and tasks.
The goal here is to have a selfhosted storage backend that exposes the data using CalDAV, iCalendar and WebDAV protocols. These are the solutions I tried:
Owncloud and its fork Nextcloud are self-hosted solutions for file sync and collaboration. It can be used as CalDAV+WebDAV storage and has a Web GUI for interacting with the data.
Pros:
Cons:
Radicale is a Python project that implements CalDAV storage for calendars and tasks.
Pros:
Cons:
SabreDAV is a CalDAV server written in PHP
Pros:
Cons:
There are other projects like Chandler/Cosmo but those are in an even worse state than the ones I mentioned above.
Google Calendar can be used as a CalDAV backend but that means the source of truth is not under my control so that’s a non starter.
For my purposes, an installation of Owncloud or Radicale + an external WebDav server seems to fit best.
After setting up local evaluation versions of Owncloud and Radicale, I then tested a number of clients on different platforms to see how they interact.
The Web GUI that comes with Owncloud
Pros:
Cons:
A QT-based Linux app, part of the KDE productivity suite.
Pros:
Cons:
Pros:
Cons:
I only tried the iOS version of this app, I assume the MacOS version works in a similar way.
Pros:
Cons:
The native calendar/reminder app on iOS supports pulling data from CalDAV but I could not get it to work with my local test instances of Owncloud and Radicale.
Joplin is an open source note taking app that has apps on all platforms and syncs over WebDAV.
Pros:
Cons:
I could not find any calendar/task clients that are available on all 3 desktop and 2 mobile platforms. Or even one that just works the same on all 3 desktop platforms.
There are apps that work well on all platforms, for example Todoist, but typically they don’t support open protocols like CalDAV and using them means having all data locked up in their silo.
These are just the apps I was able to test quickly, there might be others but most of them have a non-starter property.
The open calendar, task and notes space is very fragmented due to old protocols, wildly varying implementations and a lack of cross-platform support libraries. It’s a challenge to find a combination of storage server and clients that work well together on all platforms. To this day I did not succeed in finding a combination that satisfies all my requirements, aside from notes using WebDAV+Joplin.
So for now, I will probably start by setting up WebDAV+Joplin for notes, and keep using Google Calendar and Todoist for calendars and tasks until I figure out a complete solution.
Although the CalDAV and iCalendar protocols have their downsides, I think they are still the way to go for the foreseeable future and we should not discard them or try to replace them with something else.
We as a developer community can improve the situation by directing some community effort into the writing and maintenance of modern portable libraries for these protocols.
I myself intend to start working on a set of Rust libraries that implement these protocols (and optionally sync+localstorage behavior), combined with some FFI language wrappers so they can be easily used from cross-platform toolkits (JS for Electron, Dart for Flutter, Rust for native come to mind)