Personal Kanban and Omnifocus - Part 2


This post follows from two previous posts:

  • In which I discuss how to export OmniFocus projects for review here
  • In which I discuss using jcache.rb, a little gem for persistent data storage, here

After writing the first post about Kanban, I decided that having a list of on-hold, work-in-progress, and done projects in OmniOutliner wasn’t much better than having them in OmniFocus. It was a prettier list than before, but it was still a list.

After a bit of deliberation, I thought I might try mocking something up in Sinatra and deploy it locally using Pow.

It turned out not too shabby:

The drawing-board

Part 1: Filing the projects

The first part of this little operation is to collect data from OmniFocus and store is using jcache. I’m storing the following data-points:

  • Project name
  • Completion status:
    • Backburner: Project is marked “on hold” in OmniFocus. This is effectively my someday/maybe list.
    • Done: Project is marked “completed” or “dropped” in OmniFocus. Whether I’ve completed it or consciously decided to abandon it, my involvement with this task is complete.
    • Delegated: All available next actions have the context “Waiting for…”. Someone else needs to act before this project can be completed.
    • Deferred: All next actions have a start date set in the future. Time needs to pass before this project can be completed.
    • Hanging: This project has no tasks left. I should probably either mark it as done, or add tasks to it.
    • Work in progress: There are available next actions for me to perform.
    • You can see these in action on the above screenshot - deferred tasks have a little calendar icon with the number of days they’re deferred for listed on them (icon is purely CSS), and delegated tasks have a clock icon. Hanging projects have a tiny coathanger icon.
  • Ancestors (super-project and super-super projects up to root)
  • Deferred date (for deferred tasks)
  • Number of tasks remaining
  • ID

Depending on how much detail you want in your display you could use more or less data.

This is all retrieved from OmniFocus - if you’re using a series of text files or a TaskPaper file or a Things database or whatever, you can presumably fetch all of this in your own various ways. The important thing is that at the end of the fetching, you have an array of projects in an easily-accessible form.

Part 2: Displaying the projects

Coming into this, I thought it would be tricky, but it turns out not to. I’m basically creating an html page on the fly. Here are some cool features:


The Backburner and Done columns are significantly different to the Work in Progress column. They’re about half the size, but the projects span the whole column (while I can fit four projects side-by-side in the WiP column). Since I don’t need a huge amount of detail in these tasks, they don’t take up much vertical space.

Work in Progress

The WiP column displays a number of “active” and “total” projects. If the number of active projects climbs above 5 (and it’s practically always above five, but none of us is perfect), it’s highlighted in red, to remind me that I shouldn’t have too many projects on my plate at any one time. The number of total projects is as low as possible, but some of these are things I’m waiting a week or more to do: it’s perfectly fine to shunt them to the back of my mind for now.

Task displays

Work-in-progress tasks tell me, at a glance:

  • The name of the task
  • The domain of the task (home, work, coding, writing, etc.)
  • How many tasks remain (i.e. how easy it’ll be to close this project)
  • The current status of the project (active, deferred, delegated, hanging)

The individual projects also link back to OmniFocus using a link of the form:


Remember how I stored the project ID? This is why.

Tasks are colour-coded depending on the folder they belong to.


Since upgrading to MacRuby, I’ve had to build in a few workarounds for the foo.tasks bug. Unfortunately, this makes the refresh take about ten seconds to run its course. Refreshes occur every six hours or so (via launchd), but I can also force-refresh using the link in the top-right of the app’s window.

Remote access

I can access this window on my mac via, but I can also grab it on my iPad using some sort of advanced witchcraft from the folks at Pow. So I have a bookmark on my iPad that will serve me my projects when I’m AFK but hanging around home.

GitHub link

Here’s how it all works underneath the bonnet: GitHub linky.