Plug-In: Kanban Board

A plug-in for creating and maintaining a tag-based Kanban Board in OmniFocus. Based upon a creative concept and project by Serena (www.sleepyowl.ink) where the Kanban Board is OmniFocus tag-based and displayed as stack of horizontal elements (categories).

From Wikipedia: A Kanban Board is one of the tools that can be used to implement Kanban to manage work at a personal or organizational level. An overview of Kanban can be viewed at the Atlassian website.


Follow these steps to install, setup, and use the plug-in:

NOTE: The latest version of this plug-in uses Apple SF Symbols font for icons that automatically adapt to the current system display mode (Light/Dark). You can customize the icons (SF Symbols characters) by editing the manifest file in the plug-in bundle. (See Plug-Ins documentation)

Using the Plug-In

To use the plug-in:

TIP: For quick access, assign keyboard shortcuts to the Kanban Board actions! (Here’s how!)

The Kanban Board Interface

Traditionally Kanban Board categories are displayed as columns. In OmniFocus, categories are displayed as a vertical stack of horizontal entries:

Kanban Board Interface

Plug-In Scripts

Here are two of the scripts contained in the plug-in:

Setup Script

(() => { var action = new PlugIn.Action(function(selection, sender){ // IDENTIFY KANBAN TAG, CREATE IF MISSING var targetTag = flattenedTags.byName("Kanban") || new Tag("Kanban") // ADD KANBAN CATEGORIES IF MISSING var tagTitles = ["To Do", "In Progress", "Waiting", "Done"] tagTitles.forEach(title => { if (!targetTag.children.byName(title)){ new Tag(title, targetTag) } }) // REORDER THE CATEGORIES tagTitles.forEach(title => { var tag = targetTag.children.byName(title) moveTags([tag], targetTag) }) // SHOW THE TAGS var tagIDs = targetTag.children.map(tag => tag.id.primaryKey) var tagIDsString = tagIDs.join(",") URL.fromString("omnifocus:///tag/" + tagIDsString).open() }); return action; })();
Assign as “To Do”

(() => { var action = new PlugIn.Action(function(selection, sender){ try { var parentTag = flattenedTags.byName("Kanban") if(!parentTag){ var errMessage = "There is no “Kanban” tag. Please select “Display Board” from the “Kanban Board” sub-menu in the Automation menu to add the missing tag." throw new Error(errMessage) } var childTag = parentTag.children.byName("To Do") if(!childTag){ var errMessage = "There is no “To Do” tag. Please select “Display Board” from the “Kanban Board” sub-menu in the Automation menu to add the missing tag." throw new Error(errMessage) } var tagSet = parentTag.flattenedChildren; selection.tasks.forEach(task => { task.removeTags(tagSet) task.addTag(childTag) }) } catch(err){ new Alert("Missing Tag", err.message).show() } }); action.validate = function(selection, sender){ return (selection.tasks.length > 0 ) }; return action; })();

Return to: OmniFocus Plug-In Collection