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.

Installation

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


(() => { const action = new PlugIn.Action(function(selection, sender){ // IDENTIFY KANBAN TAG, CREATE IF MISSING targetTag = flattenedTags.byName("Kanban") || new Tag("Kanban") // ADD KANBAN CATEGORIES IF MISSING 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 => { tag = targetTag.children.byName(title) moveTags([tag], targetTag) }) // SHOW THE TAGS tagIDs = targetTag.children.map(tag => tag.id.primaryKey) tagIDsString = tagIDs.join(",") URL.fromString("omnifocus:///tag/" + tagIDsString).open() }); return action; })();
Assign as “To Do”


(() => { const action = new PlugIn.Action(function(selection, sender){ try { var parentTag = flattenedTags.byName("Kanban") if(!parentTag){ 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) } childTag = parentTag.children.byName("To Do") if(!childTag){ 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) } 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