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.
What I want
When I set out on my journey I had the following goals in mind:
I control the source of truth for all calendars, tasks and notes data by means of a self-hosted solution.
I can view and edit the data on all my machines (MacOS, Windows, Linux, iOS, Android) in a consistent manner.
Use standard protocols (CalDAV/iCalendar for calendars and tasks, WebDAV for notes).
Preference for FOSS software but not a hard requirement: for example it’s OK to use a proprietary app like the iOS Calendar app if it supports pulling
data from my datastore and is consistent with other clients.
Easy to work with multiple calendar and task sets so I can logically group data by project and still have a combined view available.
For tasks specifically I would like to have subtask support so I can divide a large task into multiple subtasks and track completion of the whole.
Ideally I want to be able to hook into task lifecycle events so I can execute my own logic when tasks are created or finished.
Notes in markdown format
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.
What I found
CalDAV and iCalendar are the established standard protocols for synchronizing calendars and tasks but these protocols have some issues:
They are very old and have accrued quite a bit of legacy
There is a lack of libraries implementing these protocols, there are libraries for languages like PHP, Java and C but these implementations are typically unmaintained and because of the nature of these languages they are not very suitable for the modern cross-platform world.
Because of the lack of libraries in modern languages there are no fully cross-platform clients
Things like subtasks are not originally in the RFC, there is support for related references in iCalendar objects but clients use wildly different implementations
of this so getting consistent subtask behavior across clients is a challenge.
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.
Selfhosted Source of Truth Storage
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/Nextcloud
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:
Open Source
Supports CalDAV/iCalendar protocols
Supports WebDAV protocol for file and note sync
Supports multiple calendar and task sets
Easy to deploy as a docker image
Includes authentication
Includes web GUI client for tasks with support for subtasks
Cons:
Written in old PHP and there is work underway to do a complete rewrite in Golang
Its GUI subtask implementation is not recognized by some other clients
Radicale
Radicale is a Python project that implements CalDAV storage for calendars and tasks.
Pros:
Open Source
Easy to deploy as a docker image
Simple configuration
Supports multiple calendar and task sets
No GUI, just storage
Cons:
No WebDAV support, needs a separate server
Does not handle authentication by default, needs to be handled by the reverse proxy
Sabre
SabreDAV is a CalDAV server written in PHP
Pros:
Open source
Support CalDAV/iCalendar protocols
Supports multiple calendars and task sets
Includes authentication
Extensive setup documentation and guides
No GUI, just storage
Cons:
Written in old PHP, according to the homepage it requires PHP 5.4
No WebDAV support, needs a separate server
Other backends
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.
Clients
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.
Web: Owncloud GUI
The Web GUI that comes with Owncloud
Pros:
Open Source
Good for basic calendar and task management
Simple CRUD operations
Supports subtasks
Web-based so it works on all platforms
Cons:
No support for additional views or filters
Not very mobile optimized
Just like the rest of Owncloud, written in PHP, and a rewrite in Golang is underway
Linux: KOrganizer
A QT-based Linux app, part of the KDE productivity suite.
Pros:
Open Source
Syncs well with both Owncloud and Radicale
Supports multiple calendar and task sets and allows view filtering and custom views
Very customizable in terms of colors, views and workflow
Fast and does not consume much resources
Recognizes subtasks created in the Owncloud Web GUI and has good subtask support
Cons:
Even though it is QT-based and open source, it relies on KDE and is therefore not suitable for running on MacOS or Windows
No mobile equivalent
Has trouble with subtasks created by other clients like 2Do
Windows: EssentialPIM
Pros:
it’s the only non-web client I got working on Windows
Cons:
Not open source
Needs a Pro subscription to enable CalDAV sync
Every calendar and task set needs to be synchronized separately
No way to filter views on a calendar or task set
Windows only
iOS & MacOS: 2DO
I only tried the iOS version of this app, I assume the MacOS version works in a similar way.
Pros:
Nice and fast GUI
Supports multiple calendar and task sets
Supports view filtering per calendar or task set
Same app for MacOS, iOS and Android
Cons:
It uses its own implementation for subtasks which is not recognized by most of the other clients
Does not recognize subtasks from KOrganizer or Owncloud
No equivalent on Linux or Windows
iOS & MacOS: Native Calendar and Reminder apps
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.
Cross platform notes: Joplin
Joplin is an open source note taking app that has apps on all platforms and syncs over WebDAV.
Pros:
Open Source
Supports WebDAV protocol
Works on all desktop and mobile platforms
Notes in Markdown
Supports vim keybindings
Cons:
I don’t have anything negative to say about Joplin yet, only the fact that its desktop apps are electron-based which is not great for resource usage. But then again that is the reason why they can deliver a consistent experience on all platforms.
Other Cross platform solutions
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.
Others
These are just the apps I was able to test quickly, there might be others but most of them have a non-starter property.
Conclusion
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.
How to fix this in the future
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)