No description
  • TypeScript 96.8%
  • JavaScript 2.6%
  • CSS 0.6%
Find a file
Felipe M. 1bf888f1c7
All checks were successful
Release / build (push) Successful in 11s
CI / build (push) Successful in 17s
Bump to 0.1.4
2026-05-13 16:45:41 +02:00
.github/workflows Use ci-base image in CI and release workflows 2026-05-04 09:27:59 +02:00
screenshots/features Merge pending tasks frontmatter feature 2026-05-02 11:33:01 +02:00
scripts Add prettier/eslint/husky as devDependencies 2026-05-04 09:55:38 +02:00
src Add nearest-heading option for rollover surrounding context 2026-05-13 11:30:30 +02:00
test Add nearest-heading option for rollover surrounding context 2026-05-13 11:30:30 +02:00
.editorconfig Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
.gitignore Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
.npmrc Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
.prettierrc.json Add prettier/eslint/husky as devDependencies 2026-05-04 09:55:38 +02:00
bun.lock Add prettier/eslint/husky as devDependencies 2026-05-04 09:55:38 +02:00
bunfig.toml Convert plain lines to tasks when cycling 2026-05-06 08:13:00 +02:00
esbuild.config.mjs Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
eslint.config.mts Clean up lint errors and bump to 0.1.1 2026-05-04 10:08:07 +02:00
manifest.json Bump to 0.1.4 2026-05-13 16:45:41 +02:00
package.json Bump to 0.1.4 2026-05-13 16:45:41 +02:00
README.md Add nearest-heading option for rollover surrounding context 2026-05-13 11:30:30 +02:00
styles.css Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
tsconfig.json Add task rollover with tree pruning and unit tests 2026-05-02 19:08:48 +02:00
version-bump.mjs Initial Obsidian markdown tasks plugin scaffold 2026-04-18 12:06:27 +02:00
versions.json Refresh pending-tasks frontmatter after rollover 2026-05-06 08:00:48 +02:00

Markdown Tasks

An Obsidian plugin for working with markdown task lists.

Features

Task gutter marker

Displays an icon in the editor gutter next to every line that contains an unfinished task, making open work easy to spot while scrolling through long notes. The icon and its color are configurable.

Task gutter marker

Task status commands

Editor commands to create tasks and toggle their status. None are bound to a keyboard shortcut by default — assign one from Settings → Hotkeys if you want quick access.

  • Create task — turns the current line into a task. Works on plain text and existing list items.
  • Mark task as open — sets the status to [ ].
  • Mark task as completed — sets the status to [x].
  • Mark task as in progress — sets the status to [/].
  • Mark task as moved — sets the status to [>].
  • Cycle task status — rotates through the statuses you have enabled in settings.

All commands operate on every line within the current selection.

Configurable status symbols

The character used for completed, in-progress, and moved tasks can be customized in the plugin settings (one character each). The cycle command's status set is also configurable — pick which of open, in progress, completed, and moved it rotates through.

Pending tasks frontmatter

Automatically tracks whether a note still has open work by writing a boolean property to its frontmatter:

---
Pending tasks: true
---

Pending tasks frontmatter

The property is set to true while the note has at least one task whose status is not the configured Completed or Moved symbol, and removed otherwise. Updates run on file modification (debounced) and via the Process current note / Process all notes commands.

Optional extras:

  • Task counts — toggle on to additionally write Pending tasks count and Total tasks count numeric properties (names configurable).
  • Root tasks only — when on, subtasks nested directly under another task are excluded from both the boolean and the counts. Tasks grouped under non-task bullets (e.g. - **Action items**:) still count as roots.
  • Folder include/exclude — limit auto-processing to specific folders, or exclude templates and archives.
  • Property name — customize the frontmatter key from the default Pending tasks.

Task rollover

Move pending tasks from past daily notes into today's note with the Roll over past tasks command (also available as a button in settings). By default, rollover also runs automatically the moment today's daily note is created — toggle this off via Run on today's note creation if you'd rather trigger it manually.

The command:

  1. Finds every markdown file in the configured Daily notes folder whose name parses as a date older than today using the configured Daily note format (default YYYY-MM-DD).

  2. For each past note, identifies every root-task subtree that contains at least one open ([ ]) or in progress ([/]) task. Other states — completed, moved, discarded ([-]), or any custom character — never trigger rollover on their own.

  3. Expands each pending tree to its surrounding context, controlled by the Surrounding context setting:

    • Top-most element (heading or list) — default. Walk outward through bullet ancestors and heading ancestors and migrate the outermost one. A heading wins over its contained list ancestor.
    • Top-most heading section — migrate the section of the highest-level heading that contains the task.
    • Nearest heading above task — migrate the section of the closest heading found by scanning upward from the task.
    • Top-most list element — migrate the subtree of the outermost non-task list ancestor.
    • Top-most task — migrate just the task tree itself (root tasks already include all their subtasks).
    • No surrounding context — same as Top-most task.

    When the chosen context kind is unavailable (e.g. Top-most heading with no heading ancestor), the rollover falls back to migrating just the task tree.

  4. Migrates the resolved block to today's note, dedented to the left margin and appended under a configurable header (default ## Past tasks). If today's note doesn't exist, it is created in the daily notes folder. The block is tree-pruned before it travels: only nodes that are pending tasks or contain a pending-task descendant are kept. Headings, non-task bullets, and other containers without any pending descendants — and completed/moved/discarded tasks — are filtered out, so the migrated block is the minimal parent path leading to each pending task.

  5. Updates the source note according to the Source action setting. Both actions operate only on the open/in-progress tasks within the block; other tasks and surrounding context are left untouched in the source.

    • Mark pending tasks as moved (default) — replaces each migrated task's status with the configured moved symbol ([>]).
    • Remove the task tree from the source — deletes each migrated task line.
  6. Appends a footer to the source note linking to today's note: Tasks were automatically migrated to [[YYYY-MM-DD]]. The footer is only added when something was actually migrated and is skipped if the same line already exists, so re-running rollover on the same day is idempotent.

Subtasks are migrated together with their root: if a deeply nested task is open or in progress, the whole tree starting from the root task moves with it.

Installation

From an Obsidian vault

  1. Build the plugin: bun run build
  2. Install it into a vault:
    • Copy build: bun run vault:install /path/to/vault
    • Symlink (recommended for development): bun run vault:install-symlink /path/to/vault

Set OBSIDIAN_VAULT in your environment to omit the path argument.

Development

bun install
bun run dev          # watch build
bun run lint         # format check + eslint + tsc
bun run lint:fix     # auto-fix formatting and lint
bun run build        # production bundle to dist/

License

MIT