While nearly everyone likely has their own sisyphean task, one of mine is the search for the perfect inbox. Trying to have just one inbox to look at for the day has continued to be a challenge, even since I wrote about it in 2020 . Recently, I have looked at my daily workflow, and how I might converge on a single, primary inbox.
Apple Reminder + EventKit
Since I am on the Apple ecosystem already, I think I will try to standardize on Apple Reminder and by extension eventkit which will let me write my own apps and dashboards while getting syncing for free. Even though Apple Reminder and EventKit does not support the entire caldav spec (which is more than a bit frustrating since several Apple developers contributed to the specs themselves), it supports enough of it that it should not be a major problem in daily usage.
One adjustment however, is that instead of using Apple’s servers for reminders, I plan on using external caldav servers, like radicale , for storage. While Apple themselves have contributed to several of the caldav specs, iCloud no longer exposes the VTASK bits of caldav properly. By using radicale for my primary store, I can still use eventkit to sync across my devices, but I can also write tools that use caldav against my data store, and be relatively sure it will still work.
The goal is that I have a single “Today” view, either via Reminders or another app. My hope is that training myself to look at that for the “one source of truth” will help with my focus.
Development Tasks
As a developer, I use a lot of other code forges with assigned issues, but they each have their own UI and API. One of the fields supported by icalendar and caldav, is a URL field. This becomes our primary key that we can use to sync with external systems.
For the past few years I have been using forgejo to manage my projects, though I also have some on codeberg and some legacy projects on github .
I have created a calendar for each forge I want to track, and have a script that runs with the basic psudo code. Using Python sets, I can fairly easily do set operations on the keys to figure out what needs to be synced.
- Get all the tasks on my target calendar
caldav_tasks = {task.url: task for task in caldav_query} - Get all the tasks on my target forge
forge_tasks = {task.url: task for task in forge_query} - Create issues for new tasks
for task in forge_tasks - caldav_tasks - Sync tasks taht exist in both
for task in forge_tasks & caldav_tasks - Complete tasks that are removed from target calendar
for task in caldav_tasks - forge_tasks
While I still need to use the forge itself for other types of planning and the details of the work, now my forge tasks show up in my unified inbox.
Household Tasks
I have some other scripts
I use to manage repeating houshold tasks, and they sync to the same inbox.
We can use rrule
support in icalendar for repeating tasks as well.
While I have not done a deep dive to verify other clients, with EventKit libraries, when marking a repeating task as complete, a new task will be created with all the details, but set to COMPLETED and the original repeating task will have it’s next DUE_DATE updated.
This is still an area I am working on.
While I do not need to edit repeated tasks too often, it’s still a little awkward.
Keeping a list of my repeating tasks in source control is nice though.
Other Possible Experiments
Since I am attempting to converge on caldav accessed via eventkit, anything that speaks caldav becomes available. To interface with more systems without a seperate sync system, I am considering rebooting my calendar bridge framework.
While I want to have a single inbox for ‘Today’, I am also looking how I might manage other tasks in Forgejo and other sources. My forgejo models experiment also lets me work on a separate dashboard to manage and review tasks.