Personal Kanban and Omnifocus

Published
6 January 2013
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.

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:

--Query OmniFocus to retrieve all backburnered, WiP and done projects

--Setting these here for scope reasons
set backburner_projects to {}
set works_in_progress to {}
set completed_projects to {}

tell front document of application "OmniFocus"
    set backburner_projects to name of every flattened project whose status is on hold
    set works_in_progress to name of every flattened project whose status is active
    set completed_projects to name of every flattened project whose status is done
end tell

And here's the whole code:

--Query OmniFocus to retrieve all backburnered, WiP and done projects

--Setting these here for scope reasons
set backburner_projects to {}
set works_in_progress to {}
set completed_projects to {}

tell front document of application "OmniFocus"
    set backburner_projects to name of every flattened project whose status is on hold
    set works_in_progress to name of every flattened project whose status is active
    set completed_projects to name of every flattened project whose status is done
end tell

--Populate a particular row's children from an array
on populate_from_array(my_parent, arr)
    tell front document of application "OmniOutliner Professional"
        repeat with element in arr
            set new_row to make new row
            set value of cell "Topic" of new_row to element
            move new_row to end of rows of my_parent
        end repeat
    end tell
end populate_from_array

tell application "OmniOutliner Professional"

    --Make a new doc for this?
    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
        make new document
    end if

    tell front document
        --Backburner
        set backburner_row to make new row
        set value of cell "Topic" of backburner_row to "Backburner"
        my populate_from_array(backburner_row, backburner_projects)

        --WiP
        set wip_row to make new row
        set expanded of wip_row to true
        set value of cell "Topic" of wip_row to "Works in Progress (max: 5)"
        my populate_from_array(wip_row, works_in_progress)

        --Done
        set done_row to make new row
        set value of cell "Topic" of done_row to "Done"
        my populate_from_array(done_row, completed_projects)
    end tell
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.