Personal Kanban and Omnifocus
Update: Part two of this post is available here.
Personal Kanban isn’t as much a productivity tool as a direction management tool. Although I guess the two are kind of linked in some weird and arcane way, in that productivity isn’t just about getting a number of things done, as it is about getting the right things done.
Look, it’s complicated, OK?
Let’s just say that if your doing things is a vector, some sort of system like GTD, splitting projects into tasks with contexts can control the magnitude of the vector, making you do more, while a “pattern” like PK is better at controlling the direction of that vector, showing you where you should apply that laser focus.
PK came about (so I am told) from factory managers in Japan, but that story’s already been told, by people with more knowledge and skill than me, so if you want more reading, go read it. The main points of PK are:
- Visualise what you need to do.
- Limit your Work in Progress (WIP).
This means things are typically divided into one of three categories - Backburner (I’ll do it, just not now), WiP (I’m doing this now, or I’ll be doing something about it in the immediate future), and Done (self-explanatory). The visualisation of this is often post-it notes on a whiteboard, moving from left to right through the three columns.

Here’s my thing: OmniFocus, the personal productivity app for OS X that I sometimes feel wedded to1 is great for the whole separating things into tasks and doing them racket. But when it comes down to it, it’s not really great at visually laying out stuff. As has been pointed out, it’s just lists - and PK is a lot more visual than OmniFocus is.
There’s a few posts (1, 2) about how to integrate the two - the one that I landed on used the service at LeanKit and synced between OF and LeanKit using a couple of applescripts and an API. But LeanKit is designed for teams, and has a bunch of features that I don’t need. I’m already losing productivity fiddling with my tools, and I don’t need more controls to fiddle with.
In fact, what I need is quite minimal - it really needs to be a visualisation of my OF projects and tasks in a “PK” view. I can do all the manipulation from OF - since this is my base of operations - and then if necessary, the changes can be reflected in PK.
Here’s some approaches.
Attempt 1: Showing it right in OmniFocus
Omnifocus has an “outliner” mentality. It might be possible to show my projects in some sort of “PK” perspective, right? In my head, I imagine three main headings - “Backburner”, “WiP” and “Done”, with all my projects in the right categories.
One stumbling block - how do I tell OmniFocus which projects are WiPs, Backburnered, and Done? I can think of two ways:
- Projects are Backburnered by default. Flagged projects are WiPs.
- Projects are WiPs by default. Backburnered projects are marked on hold.
In both cases, completed projects map nicely to our done column.
The problem is, I can’t really sort projects based on status. So much for that plan - it seems OmniFocus just isn’t made to support this level of project-viewing
Attempt 2: Showing it in OmniOutliner with Applescript
We’re trying to do an outliner view now - it’s a good thing that Omni Group make an outliner too! I’ll be exporting the data using AppleScript, which despite being a nightmare to work in sometimes, is still the best way to get data between programs on OS X.
This is the surprisingly simple export code:
1 | --Query OmniFocus to retrieve all backburnered, WiP and done projects
|
2 | |
3 | --Setting these here for scope reasons
|
4 | set backburner_projects to {} |
5 | set works_in_progress to {} |
6 | set completed_projects to {} |
7 | |
8 | tell front document of application "OmniFocus" |
9 | set backburner_projects to name of every flattened project whose status is on hold |
10 | set works_in_progress to name of every flattened project whose status is active |
11 | set completed_projects to name of every flattened project whose status is done |
12 | end tell |
And here’s the whole code:
1 | --Query OmniFocus to retrieve all backburnered, WiP and done projects
|
2 | |
3 | --Setting these here for scope reasons
|
4 | set backburner_projects to {} |
5 | set works_in_progress to {} |
6 | set completed_projects to {} |
7 | |
8 | tell front document of application "OmniFocus" |
9 | set backburner_projects to name of every flattened project whose status is on hold |
10 | set works_in_progress to name of every flattened project whose status is active |
11 | set completed_projects to name of every flattened project whose status is done |
12 | end tell |
13 | |
14 | --Populate a particular row's children from an array
|
15 | on populate_from_array(my_parent, arr) |
16 | tell front document of application "OmniOutliner Professional" |
17 | repeat with element in arr |
18 | set new_row to make new row |
19 | set value of cell "Topic" of new_row to element |
20 | move new_row to end of rows of my_parent |
21 | end repeat |
22 | end tell |
23 | end populate_from_array |
24 | |
25 | tell application "OmniOutliner Professional" |
26 | |
27 | --Make a new doc for this? |
28 | if button returned of (display dialog "Would you like me to make a new document, or paste into the existing one?" default button "New document" buttons {"New document", "Existing document"}) is "New document" then |
29 | make new document |
30 | end if |
31 | |
32 | tell front document |
33 | --Backburner |
34 | set backburner_row to make new row |
35 | set value of cell "Topic" of backburner_row to "Backburner" |
36 | my populate_from_array(backburner_row, backburner_projects) |
37 | |
38 | --WiP |
39 | set wip_row to make new row |
40 | set expanded of wip_row to true |
41 | set value of cell "Topic" of wip_row to "Works in Progress (max: 5)" |
42 | my populate_from_array(wip_row, works_in_progress) |
43 | |
44 | --Done |
45 | set done_row to make new row |
46 | set value of cell "Topic" of done_row to "Done" |
47 | my populate_from_array(done_row, completed_projects) |
48 | end tell |
49 | end tell |
This is still a work in progress. I’m interested in outputting this to text (really easy now I have the base export stuff done), but regardless of the output medium, this brings two things to light:
- I need to be able to restrict which projects are added to the list (no point putting mundane repeating projects on here).
- I may need to restrict which projects show up based on children - broad, over-arcing projects that contain five sub-projects don’t really have to be on the list.
However, as proof-of-concept, I’m pretty happy with how it’s gone.
-
Especially given how often I gaze at its mesmerising home screen or blindly do what it tells me to in the assurance that past-me knew what he was doing. ↩