OmniFocus and Calendar Notifications

I recently became tired with the fact that OmniFocus needs to be launched every once in a while in order to get the latest version of its synced database. For almost two years, I synced OmniFocus through The Omni Group’s excellent (and free) Omni Sync Server service, but I switched to a manual WebDAV location hosted on my Macminicolo machine because I like to be in control of the app’s sync sessions, and to fiddle around with ways to better automate the app’s syncing system.

Over the past few months, however, I have found myself increasingly missing notifications for due items because I am not always using the same device to manage OmniFocus, and I tend to forget to launch the app and hit the Sync button. I may go a full week without using OmniFocus for Mac, but I’d still like to be reminded of important items even if I don’t sync my iPhone and iPad all the time. Unfortunately, in the way OmniFocus is structured, the standard sync doesn’t allow items to be “pushed” in the background.

I came up with a way to have OmniFocus’ due reminders synced “in the cloud” and always up-to-date that enables me to keep using the app like I always have, yet staying assured I won’t miss items because I forgot to sync or open the app. It uses OmniFocus’ built-in calendar export functionality, and a mix of automation, Macminicolo hosting, and third-party apps to get the job done reliably and consistently. It’s not perfect (mainly due to Apple’s fault) and it’s likely doable in some other way with some other hosting solution, but I found this method to work perfectly for me in my workflow.

What I use

OmniFocus comes with a “Subscribe in iCal” feature (available in Preferences -> Sync) that lets you “publish” due reminders as a calendar apps like Apple’s Calendar or BusyCal can subscribe to and check periodically for changes.

These reminders are forwarded to the calendar application as an .ICS file located in the same directory of your sync database, and they are displayed with a “Due” prefix to distinguish them from “regular” calendar events. You can’t add new items to a subscribed calendar (say, using Fantastical) — it is only a way to display OmniFocus’ due data outside of OmniFocus, while keeping basic task information like dates, duration, and URLs intact. My goal was to make sure a single calendar — always available with the latest tasks — could send notifications to iOS devices and my Mac independently from OmniFocus.

The first step was to make sure the OmniFocus app running on the Mac mini could sync its database (and thus publish new reminders to the calendar file) as often as possible. There are no settings to tell OmniFocus to sync every few minutes, so I set up a script to sync OmniFocus every time on startup/login and every minute (the Mac mini is always running, so I don’t care if OmniFocus keeps syncing in the background). The script uses OmniFocus’ own AppleScript dictionary (tell front document of application “OmniFocus” to synchronize) to tell the app (which needs to be open) to sync, and it’s loaded by Lingon 3, a utility that makes it easy to launch scripts at regular intervals and manage them with a GUI.

The fact that OmniFocus syncs every minute is also functional to my habit of entering new tasks into the app quickly and without actually using OmniFocus. As previously detailed and now working even better thanks to the Mac mini, I rely on Captio (recently updated, too) to quickly send new tasks to OmniFocus and have Mail.app process them.

Using Captio, new tasks show up in the OmniFocus database in seconds, and because the app syncs often, they are also pushed around within 60 seconds. To top it off, Captio supports TextExpander snippets on iOS, which means I can type in a few characters to comply with OmniFocus’ email syntax (not really convenient to access with the iOS keyboard). If you’re feeling adventurous, you could also use apps like Drafts to save tasks as text files in Dropbox, and have a combination of AppleScript and Hazel process them as input for OmniFocus. However, I prefer Captio’s straightforward approach to letting me push task to OmniFocus without opening OmniFocus.

The last part was to grab the OmniFocus-generated .ICS file, and subscribe to it via Calendar. And that’s where things got tricky — per Apple’s own implementation of iCloud and calendar subscriptions. As I tweeted, iCloud allows you in theory to keep calendars and calendar subscriptions synced across devices. In actual testing, though, I found the implementation to be unreliable and utterly simplistic, in that iCloud-synced calendar subscriptions wouldn’t refresh after the initial sync. I kept wondering why iCloud was syncing my .ICS subscriptions, but notifications wouldn’t go off as planned. A quick trip down Apple’s support lane confirmed iCloud was the culprit. In short: don’t sync your calendar subscriptions through iCloud if you want them to refresh reliably and correctly.

Fortunately, both iOS and OS X let you add manual calendar subscriptions. On OS X, fire up Calendar, and add a New Calendar Subscription simply by pasting the direct link to your .ICS file.

On iOS, it’s a bit more hidden: open Settings, head to Mail, Contacts, Calendar, add a new account, choose Other, then Add Subscribed Calendar.

Make sure to not remove Alerts and Attachments (Alarms on iOS), and set auto-refresh to the lowest setting available (5 minutes on OS X). Obviously, don’t sync the subscription with iCloud, but choose “On My Mac” instead.

As for the .ICS file itself, I keep it on my Mac mini and access it via standard OS X authentication (which is supported by calendar subscriptions), but you could also build a Hazel rule that mirrors it to another location on your Mac (like the Dropbox Public folder) or on the web (like your own FTP server, for which I recommend Transmit’s Disk functionality). In my tests, I tried to make Google Calendar crawl the Dropbox URL for the .ICS file because I wanted to test this hack with Cue; Google Calendar doesn’t support Dropbox links for publicly available .ICS files, and the service doesn’t have settings for calendar subscriptions either. In my opinion, you’d be better served with creating a WebDAV directory on your Mac or copying the .ICS file to your own FTP server.

With everything set up this way, I rely on my existing Mac mini (which I love — I highly recommend Macminicolo) to have OmniFocus always synced, fast, easily accessible, and, more importantly, available outside of its own app environment thanks to calendar notifications. I don’t miss due reminders anymore, and when on iOS, I also get a nice list view of upcoming items thanks to Readdle’s Calendars app. For the future, I wish Apple would bring proper subscription sync to iCloud with more settings; I’d also like to see a simpler email syntax coming to OmniFocus — but not as much as a web interface for OmniFocus.

I am using a Mac mini server to speed up OmniFocus; even if you don’t own a Mac server, though, you should consider using your computer and the tips above to automate the process of task creation and sync.