erikars46k downloadsOrganizes all of the tasks within your files into a kanban view.
Task List Kanban is a free, open source Obsidian plugin that turns Markdown tasks from your vault into a kanban board. Tasks stay in their original files, and changes made from the board are written back to Markdown.
Use it to:
Click the New Kanban board ribbon icon, run Create new kanban board from the command palette, or open the dashboard and choose New board. Each flow lets you choose the destination folder.
You can also right-click the folder where you want the board file, then choose New kanban.
Open the dashboard from the board rail or run Show board dashboard while a kanban view is focused. The dashboard lists every board in the vault, shows task counts plus updated/opened timestamps, and lets you create or switch boards without hunting through files.
Cards show open/done totals and an expandable per-column count breakdown. Boards with a due-date property schema also show overdue and due-today badges, independent of the board's current filter.
From the dashboard, right-click a board card to rename, hide, show, or delete that board. Delete asks for confirmation and moves the board file through Obsidian's trash flow. Drag cards to choose the dashboard order; hidden boards move under Other boards instead of becoming inaccessible.
When your vault has more than one board, the board rail gives one-click board switching. Drag rail items to reorder boards. In plugin settings, dock the rail on the left or across the top; the left rail can also be resized.
Create Markdown tasks in any included file:
- [ ] Write release notes #this-week
Task List Kanban supports the standard Markdown task bullets -, *, and +.
With the default name-matched columns, tasks without a column tag appear in Uncategorized. Add the column tag in Markdown or drag the task to that column on the board. You can also configure columns to match text, status markers, or priority. Placement tags are hidden from task cards; matching text stays visible.
Click Add new at the bottom of a column to create a task from the board. If a default or recently used task file is available, the input opens immediately; otherwise, choose a file first.
In board settings, New tasks groups the Default task file, Daily note path, optional Heading, and Insert at top controls. Turn Insert at top on to insert at the top of that heading's section, or leave it off to insert at the bottom. Heading defaults to blank; “E.g., tasks” is only an example placeholder. Leave Heading blank to use the whole file. The same heading and position apply to every file you create tasks in, including file swimlanes, mobile creation, and Add card. Plugin-wide board defaults can supply the heading and position, with normal board overrides.
Headings match their exact text (without # marks), using the first matching
ATX heading at any level. A missing heading is created as ## Heading at the
selected end of the file. A section includes its deeper subsections. At top of
the whole file means after YAML frontmatter. Existing boards continue to append
to the file until you change these settings: Heading is blank and Insert at top
is off by default. These preferences affect new tasks;
duplicates, subtasks, and moved tasks keep their existing placement behavior.
The file picker offers Today's daily note above the folder list, and Default task file can be set to Today's daily note instead of a specific file. Either way, each new task goes to the note for the day you add it, so a board left open overnight moves on to the next day's note by itself. If today's note doesn't exist yet, adding a task creates it (with any missing folders) and puts the task in it.
By default, the note's location comes from Obsidian's core Daily notes
plugin. New notes use the core plugin's template when one is set. To use a
different location, set
Daily note path in New tasks to a path with the date in double braces,
such as daily/{{YYYY-MM-DD}}.md or Journal/{{YYYY}}/{{YYYY-MM-DD}}.md.
Dates use Moment.js format tokens.
The core template still applies at that location. Like the heading and
position, Daily note path can be set once in the plugin-wide board defaults.
A daily note outside the board's scope is never offered or created.
Open board settings with the settings icon in the top-right corner, or run Open current board settings while a kanban view is focused.
Board settings inherit from plugin-wide board defaults unless the board has its own override. In the settings modal, inherited fields can be pinned to freeze the current board value, or reset so the board follows the defaults again. The command palette also includes Use current board settings as global defaults and Prune board settings that match the defaults for keeping older boards tidy.
Plugin settings include:
Choose which files feed the board:
Selected paths can follow a date-named daily note with a Moment-format
template such as daily/{{YYYY-MM-DD}}.md. The board resolves it using your
local date and refreshes at midnight. Existing boards configured with
Selected folders retain that legacy behavior until you convert them.
The first time you choose Selected paths, any saved Selected folders entries
are copied in as a starting point. Converting directly from legacy Selected
folders also keeps the board folder selected, preserving that mode's prior
coverage; you can then edit the paths normally. Selected paths must include at
least one file or folder; the board-folder toggle counts as one source.
Use Excluded paths to omit directories or files after scope is applied. Boards using their folder or legacy Selected folders keep that folder protected; in Selected paths, exclusions apply to every selected path, including this board's folder when you choose to include it.
Use the Columns section to rename, color, remove, and reorder custom columns. Uncategorized and Done stay fixed at the top and bottom of the settings list, with separate visibility and name controls.
Column matching options:
In Progress matches tags such as #InProgress, #in-progress, and #In-Progress.status/active and project/alpha matches only tasks with both tags.@office or [[Project A]]. Matching is case-sensitive and uses the trimmed title directly, without tag conversion or a separate matching-text field. A Text column titled office matches office, not #office. It must be a standalone token: @home does not match an email address, @homework, or @home-office. Moving a card adds, removes, or replaces the literal in its source line. The matching text stays visible in the task description, including in its own column, so intentionally inline context and links remain readable.[ ], in-progress [/], or blocked [!]. Moving a task into that column updates the checkbox marker.Column display options:
#FF5733 to show a color bar on the column and its cards.Keep column metadata when completing, below Add column: leave a task's column tag in place when it is completed or archived, and its text column literal when archived, for example - [x] Write report #doing. Done and Archived still take priority over the kept metadata, so the task shows in Done or stays hidden. Unchecking the task returns it to that column, and dragging it to another column swaps the tag or literal as usual. Completing or moving to Done always preserves text literals and priority, regardless of this setting. Status-based columns cannot be kept, because completing a task changes its status. Off by default.
Enable Consolidate tags in settings to move non-column tags to the card footer.
The Excluded tags setting hides configured tags from cards, tag grouping, and consolidated tag footers. A settings button can automatically exclude all tags mapped to active columns.
Board flow controls the desktop arrangement and the leading hierarchy on mobile:
For an ungrouped mobile board, the group-dominant options naturally render as a simple column list. Group order remains controlled by the grouping direction setting.
Card width can be adjusted from the view controls between 200px and 600px.
On mobile, boards use full-width task rows with column-colored left edges. View and Search sit together on the left of the toolbar; source-file options and Settings sit on the right. Search expands when needed and stays visible while a filter is applied. Tap the folder icon to choose and open source files.
Each expanded section that supports task creation has its own floating + button. It stays within that section while scrolling, so creation retains the column and group destination, including Uncategorized. New and existing tasks use the same keyboard-aware editing sheet with explicit Create/Save and Cancel buttons. The destination file appears in the creation sheet instead of a repeated row on the board. View settings and source-file options open as full-height panels on mobile.
Enable a Property schema in settings to read and write task metadata from the Obsidian Tasks plugin or Dataview inline fields.
Task List Kanban can display, sort, group, and edit metadata from either integration while keeping each task in its source Markdown format.
The Show properties setting controls whether parsed metadata appears on task cards:
When the schema is Tasks Plugin or Dataview, task cards show a compact + Date control. Use it to set or clear due, scheduled, and start dates directly from the board. New tasks created from the board can include the same dates.
Date writes use the selected integration's native format:
- [ ] Send invoice 📅 2026-06-15 ⏳ 2026-06-16 🛫 2026-06-17
- [ ] Send invoice [due:: 2026-06-15] [scheduled:: 2026-06-16] [start:: 2026-06-17]
Completing an open task from the board adds a completion date when the selected schema supports it and the task does not already have one:
- [x] Send invoice ✅ 2026-06-15
- [x] Send invoice [completion:: 2026-06-15]
Existing completion dates are preserved. Reopening, moving, cancelling, archiving, or editing a task does not remove or rewrite historical completion metadata.
Enable Treat nested tasks as subtasks to show only the root task as a card while keeping nested tasks and notes inside that card. Nested rows can be edited, status-cycled, added, deleted, and reordered from the card without turning each child task into its own board card. Cards with subtasks show a completion count, percentage, and progress bar.
When this mode is on, source-block actions stay together: moving, duplicating, deleting, or archiving the parent card operates on the owned nested Markdown block instead of only the first task line.
Task status visuals come from your active Obsidian theme or plugin CSS.
Status marker settings control how checkbox characters behave:
xX.-.#archived with status: use one or more archive status markers instead of the archive tag. The first configured marker is written by Archive; all configured markers are hidden as archived. Archive markers cannot overlap other status roles. Existing #archived tags are left intact but ignored by boards using archive statuses, so another board can still use tag-based archiving.For example, with archive markers set to dD, archiving - [/] Review notes writes - [d] Review notes. Both [d] and [D] are then treated as archived and hidden. Changing an archived marker to a non-archive status makes the task visible again.
Examples:
xX recognizes [x] and [X] as done.xX✓ also recognizes [✓].- hides [-] tasks.Cancel and restore only change checkbox markers. If a cancelled marker is also configured as ignored or done, that marker setting determines whether the task is hidden or treated as complete.
#archived tag. Boards configured to replace the tag with an archive status write their first archive marker instead. Completing or archiving a task never removes its priority.Enable Show archived column in View to browse archived tasks beside the board. This view option is saved per board and can be included in saved views. The separate pane stays on the right in every layout, with its own scrolling and controls at the top.
Archived tasks appear in file order, 50 per page, using the board's scope, filter, and tag or status archive settings. Previous, Next, and Refresh browse one page at a time without loading the whole archive. Collapsing or hiding the pane stops archive scans. Active task counts exclude the archive.
Archive changes refresh the first page; newly archived tasks may sort onto later pages. Open source file opens the original note. Restore to Done verifies the source row before editing it and preserves existing completion dates and nested content. On status-based boards, restoring preserves any #archived tag, so tag-based boards may still treat that task as archived.
Use the Sort dropdown in the board header to order tasks within each column:
Manual sorting keeps pinned tasks together at the top of the column. Pinned cards show a pin marker; click it to unpin the task and return it to the file-order tail. When a task is first pinned, the plugin will add an Obsidian block link like ^abc123 to the source line unless one already exists, so the order survives text edits and reloads.
Manual drag reordering is available when the board is not grouped. When grouping is active, saved manual order still displays, but the Manual sort option is readonly until grouping is turned off because relative order would not be stable across different groupings.
The search bar above the board filters tasks with a single query. A query is a space-separated list of tokens, and a task must match every token:
| Token | Filters by | Example |
|---|---|---|
word or "quoted phrase" |
content contains the term (case-insensitive) | fix, "big rocks" |
tag:x or tag:x,y |
task has the tag; a comma list matches any listed tag | tag:home,errand |
file:x or file:x,y |
file path contains any listed entry (case-insensitive) | file:projects |
due:<$TODAY |
date property compared to a date | due:<=2026-07-04 |
key::value |
a task property equals a value; key::a,b matches any listed value, key::* matches any value, and key::<=3 compares numbers or priorities |
project::website, priority::>=high |
Details:
fix tag:home file:projects due:<$TODAY keeps tasks containing "fix", tagged home, in a file path containing "projects", due before today.- to exclude it: "Paul Krugman" -Keynes, -tag:archived, or -file:archive. Date comparisons cannot be negated. Quote a literal content term beginning with -.OR group for alternatives, including mixed types: (Krugman OR Friedman) -Keynes or (tag:reading OR file:essays). Groups cannot nest, and - applies only to one condition. Outside parentheses, OR remains a literal content word.tag: tokens AND together, so tag:home tag:errand requires both tags, while tag:home,errand matches either. Repeated file: tokens merge into one "any of" list.file:"weekly notes".due, scheduled, start, done, created) with an operator (<, <=, =, >=, >) and either a YYYY-MM-DD date or $TODAY, which re-evaluates at midnight. Tasks without the referenced property are never hidden by a date token.priority, status (the checkbox marker, with status::todo for a space), and any Dataview inline field such as [project:: website]. Values match whole and ignore case (project::web does not match website). Priorities compare as highest > high > medium > none > low > lowest, and a task without a priority counts as none. Negate with -, as in -owner::* for tasks with no owner. Property tokens read only the task's own line, not nested subtasks. Date properties support only due::*; compare dates with due:<….note: or a bad date value) is treated as plain content text.Filtering applies when you press Enter. Invalid boolean syntax shows an error only then and keeps the last applied filter; the draft stays available to correct. As you type, suggestions appear for the token under the caret — tag names, file paths, date keys and operators, property keys and their values, and query-only saved view names. The sliders icon expands a structured editor under the bar; it and the bar are two views of the same query, so edits in either stay in sync. Filters persist per board.
Saved views live in the expanded view controls. A saved view can capture the current filter, sort, grouping, flow direction, and card width. Save one with an optional name, click it to apply its stored view properties, or delete a board-local saved view with the × control. Query-only saved views also appear as search bar suggestions, so the older saved-filter workflow is still there in a more general form. Global saved views are read-only from the board and can be edited from plugin settings.
The gutter above the board shows a Done / Advance / Select card action mode selector to the left of the total task count. The icon matches the action shown on cards: square for Done, arrow for Advance, and circle for Select. Open its menu for mode names and descriptions. The chosen mode applies to every column and is saved separately for each board.
After selecting tasks, use each column's bulk menu to move, complete, cancel, restore, archive, duplicate, or delete them. Selected-card command palette actions are also available for marking done, cancelling, archiving, duplicating, and deleting. Dragging one selected task moves all selected tasks in that column.
Use Group by in the board header to split tasks into swimlanes.
Group and column headers stay visible while scrolling grouped boards, making large swimlane views easier to scan.
Use a swimlane header's collapse control to fold or expand that lane. Collapsed lanes retain their header and task count, and can still receive dragged tasks. Collapse state is saved per board and shared between desktop and mobile.
Tasks are grouped by source Markdown file.
Tasks are grouped by their source file's immediate parent folder. Tasks in the vault root appear in a Root swimlane.
Tasks are grouped by tag, optionally limited to a configured prefix.
Choose Text in Group tasks, then add literals such as [[Project A]]
and [[Project B]]. Reorder the list with its arrow buttons. Each listed
literal gets a lane, including when empty, plus Unassigned. The first
matching literal in list order decides a task's lane; reversing the displayed
group direction does not change that decision.
Dragging between text lanes replaces the source literal in place; dragging to Unassigned removes it. A task with another listed literal then belongs to that lane. New cards inherit both their lane's literal and their column metadata. Column and lane literals both remain visible in task descriptions. The editor warns when a column and lane share a literal because lane moves can change column placement.
Text matching is literal and case-sensitive, with no regex or wildcards.
For example, @office does not match @Office; differently cased column
titles and lane literals are distinct. Case-only column renames also offer
Update existing tasks, which skips done tasks.
Literals cannot be blank, span lines, begin with # (use Tags instead), or
repeat within the same list. A literal matches at the start of task content
or after whitespace, (, [, or a quote, and ends before whitespace,
punctuation, or the end of content. Letters, digits, _, -, /, and @
continue a token. Only the task's own line is searched. Renaming a linked note
updates its task links in Obsidian; edit the corresponding column title or lane
literal to follow the new name. Changing a lane list never rewrites tasks.
When a Tasks Plugin or Dataview property schema is enabled, tasks can also be grouped by parsed properties. Date groups support Combine past dates so overdue dates can collapse into one past bucket.
Tasks created within a property swimlane inherit that lane's property value.
When grouped by due, scheduled, or start, run Reschedule overdue tasks to today from the command palette, or use the calendar button on the combined Overdue swimlane, to set that date to today on every visible open task whose date has passed. Filtered-out, done, and cancelled tasks are left alone, and no other dates change.
Saved views replace the older saved grouping workflow and can reuse common grouping setups, including folder, file, tag-prefix, include-list, and property groups, group direction, and the surrounding layout.
The current README still uses older screenshots. Useful new or replacement screenshots would be:
npm install
npm run dev
Build output is written to the repository root for Obsidian plugin loading.
npm run lint
npm run build
npm test
npm run lint runs ESLint (use npm run lint -- --fix for safe automatic fixes). npm run build runs TypeScript checking and a production ESBuild bundle. npm test runs the Vitest suite.
Deploy to the vendored test vault:
./tools/deploy_for_manual_test.sh
This runs npm run build and npm test, then copies the built plugin into test-vault/obsidian-plugin-dev/.obsidian/plugins/task-list-kanban/. Pass --lint to also run npm run lint and npm run communitylint before the build. You can pass a target directory to deploy somewhere else; --lint works before or after it.
Bump the version:
npm run version
Commit the version changes, create an annotated tag, then push main and
the tag.
Wait for GitHub Actions to create the draft release with built assets.
Edit and publish that draft from the releases page.
Do not create a release draft manually with gh release create or the GitHub UI; the automated draft is the one with the correct assets.