Personal Kanban and Omnifocus

Published
2012-12-06
Tagged

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:

  1. Visualise what you need to do.
  2. 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.


  1. 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.